- Как воспользоваться этим курсом ?
- Как распорядится его ресурсами правильно ?
- Где и какую искать
информацию ?
- Где найти схемы и программы
- Где купить МК и электронные компоненты ?
- Как
сделать электронное устройство ?
- Пример:
Что можно взять полезного из АпНоута.
Наберитесь терпения и прочитайте весь курс (он укорочен и сжат насколько возможно)
Читая первый раз, не расстраивайтесь что вам не все понятно - это нормально, однако в результате чтения вы ознакомитесь с содержанием курса и будете знать о чем и где примерно в курсе идет речь и МК термины будут у вас "на слуху".
Затем читайте краткий курс более внимательно и ОБЯЗАТЕЛЬНО ДЕЛАЙТЕ то что прошу вас делать в курсе и в упражнениях-задачах курса. Упражнения - задачи курса - это практические примеры постановки задачи, создания алгоритма, написания программ для МК, симуляции и отладки устройства. Они содержат необходимые теоретические материалы и архивы с полученными программами и результатами.
Если мало знаний по электронике, но есть желание что-то сделать - то главное у Вас уже есть! Человек умеющий читать, может все !
Для вас Книги по электронике:
Особенно рекомендую начинающим книги по основам электроники и схемотехники:
Настольная книга электронщика:
П.Хоровиц, У.Хилл. Искусство схемотехники - общепризнанная библия электронщика на РУССКОМ языке. Уже 5-е издание - от теории полупроводников до типовых электронных схем с подробнейшим описанием принципов их работы ! Аналоговая и цифровая электроника.
аналогичная книга: У.Титце и К.Шенк "Полупроводниковая схемотехника".
По ходу работы ОБЯЗАТЕЛЬНО:
записывайте возникающие вопросы, и лучше на бумагу - моторная память !
ищите в DataSheet (ДШ) регистры и устройства МК используемые и упомянутые в задаче, прочитайте о них подробней. Уясните роль каждого бита и регистра.
если вопросы остались перечитайте задачу снова, eсли вопросы не разрешены, ищите ответ:
1) в help и документации компилятора, симулятора и других используемых программ!
2) поиском Windows в папках и help компилятора и симулятора.
Ищите ключевые слова содержащиеся в тексте файлов, а не в их названиях !
3)
в моем
AVRFAQ - это сборник ответов на
часто задаваемые мне
по курсу вопросы и советы по применению МК от
знающих людей.
4)
Если все же не найдете ответа - задавайте вопрос
в конференции Вам
ответят правильно в течении дня
Если вы правильно, на
нормальном русском языке,
продумайте и
сформулируете ваш вопрос и лучше напишите его в теме.
Вам ПОКА не нужно покупать МК, радиодетали и паять что либо !
Вы сможете не имея МК проделать весь цикл разработки управляющей программы для него :
- написать программу для МК в компиляторе и скомпилировать ее,
- запустить и отладить ее на компьютерном симуляторе МК,
-
получить осциллограммы сигналов вашего устройства
работающего виртуально, на вашем ПК.
-
увидеть на мониторе ПК как в симуляторе
VMLAB МК мигает светодиодами,
реагирует на нажатие кнопок, выводит информацию на LCD, измеряет
напряжения, работает с логическими и аналоговыми элементами схемы,
-
посмотреть как МК ведет обмен по интерфейсам i2c TWI 1-wire
rs-232 UART
TWI и записать его для последующего анализа.
-
увидеть как МК отрабатывает прерывания по событиям, засыпает для
снижения энергопотребления и просыпается.
-
"остановить" и "отмотать назад" время !
что просто не
возможно в реальном МК.
-
симулировать ДВА МК ! одновременно в одной схеме. При этом во второй МК
вы можете поместить программу имитирующую работу какого то нужного вам
компонента отсутствующего в симуляторе и даже в природе.
-
обменятся информацией с симулируемым МК и результат обмена сохранить
в
файл для последующего анализа.
PTOTEUS - очень мощный, серьезней пакет не только симулирования чего душа пожелает (аналоговая, цифровая, микроконтроллеры, PLD) Hо и для проектирования электроники от идеи до файлов для изготовления печатной платы ! Протеус является ещё и прекрасным интерактивным справочником по электронным компонентам ! в PTOTEUS вы можете увидеть как МК работающий по вашей программе "общается" с электродвигателями, с шаговыми моторами, с серво, с картами памяти, с жестким диском, сможете даже сыграть с МК в шахматы ! в симуляторе PTOTEUS вы можете симулировать в одной схеме работу нескольких разных МК одновременно ! причем это могут быть МК разных семейств - AVR, PIC, 8051, ARM7, Motorola MC68HC11.
Прежде чем "изобретать велосипед", т.е. делать свой вариант какого либо устройства ( и не только электронного ! ) которое наверняка целиком или частично уже было сделано многими людьми и даже трудовыми коллективами - разумно поискать и посмотреть результат их труда и использовать его по максимуму ! ОБЯЗАТЕЛЬНО ИЩИТЕ существующие аналоги того, что вы хотите сделать
- по похожим названиям
- по аналогичному назначению
- по ключевым словам
- по сходной тематике
Ищите
источники схемотехнических, алгоритмических, программных аналогий. Анализ
того что сделано другими поможет
вам избежать многих досадных ошибок и
тупиковых решений.
Отправной точкой в поиске может быть сайт
компании
Телесистемы.
Эта компания производит множество устройств на МК - схемы этих устройств
выложены на их сайте и доступны для скачивания. Там же есть очень полезный
раздел:
проекты на микроконтроллерах на русском языке
- это читатели сайта и самой
"живой" русскоязычной МК конфы (доброжелательная атмосфера,
быстрые ответы даже на "дурацкие" вопросы ламеров, полезная информация - уже
более 1300 страниц архива конференции!) публикуют свои разработки
там схемы и даже прошивки к большинству
из них. Скорее всего вы найдете то что
хотите сделать ! Либо почти "то" и вам
останется лишь немного подправить схему или программу под свою задачу.
Возможно вам будет проще найти и использовать подходящий электронный набор MasterKit или Velleman - очень большой перечень устройств - цена умеренная В любом случае там вы можете взять схему и принцип работы устройства, а иногда и прошивку.
Методика работы с МК - как и с ЛЮБЫМИ электронными компонентами, такова - Hаходите на сайте производителя или на AllDataSheet или в google.com и скачивайте:
- DataSheet - основной документ по компоненту - его паспорт (далее ДШ). обычно в формате .pdf
- Errata - описание уже обнаруженных ошибок компонента - для МК AVR серии ATmaga ошибки МК перечислены в конце ДШ.
- Application Notes, Design Notes - примеры применения
АпНоуты (Application Notes, апликухи) - важнейшие после ДШ
документы. В них обычно публикуется схема, описание принципа работы
и программа на Си или ассемблере если компонент программируемый.
Обязательно скачайте
AVR Application Notes
и
.zip файлы с кодом программ к
ним! Когда вам что-то не ясно просмотрите бегло их, наверняка
наткнетесь на схему или код нужный вам как раз сейчас.
Некоторые из
AVR Application Notes любезно
переведены
на русский язык и доступны благодаря проекту
GAW.ru
- Development Boards или Kits - платы для разработки
- Reference Design - пример устройства на компоненте
-
White paper - поясняющая статья
Это примеры применения компонента в реальных электронных устройствах,
советы и наставления ...
Вот тут найдите ( пример применения = АпНоут = application note ) AVR492: "Brushless DC Motor control using AT90PWM3"
Скачайте документ doc7518.pdf и архив avr492.zip с кодом программ для МК.
|
|
|
|
|
|
BLDC motor - дословно переводится как Бес Щеточный Постоянного Тока мотор. По-русски ВЕНТИЛЬНЫЙ электродвигатель. Однако питать его постоянным током нельзя - сгорит ! Его нужно питать 3х-фазным переменным напряжением с фазой зависящей от положения ротора ! Рассматриваемое устройство как раз преобразует постоянное напряжение в 3-х фазное переменное. Подробно и главное понятно про электропривод читайте на stepmotor.ru - там же можно купить электро-мотор-редукторы и шаговые двигатели. |
|
|
|
|
|
AN492 "Контроллер вентильного двигателя на МК AVR AT90PWM3"
Открываем документ - doc7518.pdf и видим :
- Вначале прекрасную теорию управления трехфазным бесщеточным электродвигателем, обратная связь осуществляется по сигналам 3-х датчиков холла.
- Далее на стр. 6 начинается объяснение широко распространенного алгоритма автоматического регулирования ПИД (англ. PID) FAQ PID и настройка ПИД регулятора
- Очень интересная методически таблица 8 - использование выводов МК - советую вам делать такую для своего устройства - удобно одним взглядом видеть что подключено к каждой ножке МК в вашем устройстве.
- Далее фотография платы готового устройства - говорят лучше 1 раз увидеть чем 100 раз услышать - это действительно так.
На плате устройства можно увидеть
- как правильно располагать электронные компоненты,
- какие они бывают,
- как выглядят,
- как правильно конструировать плату.

- Далее идут листы с частями схемы устройства - схемы сложных устройств иногда удобней разбить на функциональные блоки и рисовать на отдельных листах :
Посмотрите схемы и попробуйте найти компоненты на плате устройства, отследить печатные проводники на плате - в общем поработайте с информацией себе на благо!
1) Лист 2/4 схема POWER - стабилизатора питания МК - готовый вариант для вашего устройства ! ИСПОЛЬЗУЙТЕ !
Микросхема U6 стабилизатор питания MC78M05 (корпус Dpak ищи и смотри ДШ на MC78M05 - черный квадратный прибор под алюминиевым бочонком) - дает стабилизированные 5 вольт для питания МК из 12 вольт (это здесь, а вообще диапазон входного напряжения может быть шире) от внешнего источника питания устройства.
Вот интересно - диод D5 (вертикальный цилиндрик на плате вверху под зелеными клеммами) с конденсатором C19 (алюминиевый бочонок чуть ниже диода) позволяет МК получать непрерывное питание 5 вольт даже при кратковременном обнулении входного напряжения - такое очень возможно при коммутации мощного эл. двигателя, еще при этом возникают значительные импульсные помехи в проводе питания - их гасят конденсаторы C18 C19 C20 и резистор R25 значительно повышает эффективность конденсаторов C19 C20 в подавлении помех от источника питания.
Резистор R25 еще защищает стабилизатор MC78M05 от короткого замыкания выхода +5 вольт на землю - он ограничивает ток.
Светодиод D6 (smd корпус - белый прямоугольничек под стабилизатором MC78M05 ) индицирует наличие +5 вольт питания МК - это очень удобно и правильно!
|
|
|
|
|
|
ВАЖНО ! Необходимыми для питания устройства являются лишь 3 элемента - стабилизатор и по одному конденсатору на его входе и выходе. Но компонентов значительно больше - это сделано для обеспечения надежной работы устройства. Не поддавайтесь копеечной экономии и обманчивой простоте "ведь работает же" - это не критерий ! Устройство должно работать надежно ! |
|
|
|
|
|
2) Правее можно увидеть схему интерфейса LIN - он очень широко применяется в автомобилестроении и в других местах с сильным уровнем помех и позволяет передавать сообщения по последовательному протоколу (хорошо совместим с USART и UART) между устройствами с соединенными "землями" по одному сигнальному проводу со скоростью до 20 Кбит в секунду.
3) на странице схемы 3/4 изображен МК.
Есть несколько интересных моментов:
Питание на МК (вывод VCC) и на встроенный в МК АЦП (вывод AVCC)
подается через резистор 10 Ом и эти выводы зашунтированы 10 нФ конденсаторами
на землю устройства - это сделано для фильтрации (ослабления) высоко
частотных и импульсных помех наводящихся на цепи питания устройства.
Лучший результат можно получить поставив вместо резисторов индуктивности по 60-100 нГн а совсем уж крутизна применить специальные проходные фильтры для питания, например Murata.
К выводу опорного напряжения АЦП МК (вывод AREF) подсоединен лишь конденсатор 100 нФ на землю для снижения пульсаций напряжения - очевидно используется внутренний источник опорного напряжения - такой имеется и у МК ATmega - на 2,56 вольт.
Обратите внимание на разъем J2 JTAG-ISP - этот разъем позволяет прошить МК прямо в системе (с помощью ISP адаптера) и проводить отладку и мониторинг работы программы МК прямо в готовом устройстве по интерфейсу JTAG .
4) На странице схемы 4/4 изображен мощный драйвер для 3-х фазного электро-мотора. Сделан ОЧЕНЬ ПРАВИЛЬНО - надежно!
Оставив 4 транзистора из 6-ти вы получите классический Н-мост (H-bridge) и с его помощью можете управлять обычным коллекторным (щеточным) электродвигателем постоянного тока - DC motor.
- полевые транзисторы-ключи SUD35N05-26L (6 черных квадратиков справа на плате) управляются МК через специальные драйверы IR2184 для полевых транзисторов.
|
|
|
|
|
|
Драйверы IR2184 обеспечивают правильные сигналы на затворах полевых транзисторных ключей гарантирующие полное и быстрое их открытие и быстрое закрытие - это снижает выделение тепла на транзисторах. Кроме того автоматически формируют паузу между открытым состоянием нижних и верхних транзисторов одного плеча моста. Одновременное открытое состояние транзисторов вызовет протекание "сквозного тока" от источника питания через оба транзистора ! А "по жизни" ток должен протекать через нагрузку. Используйте драйверы аналогичные IR2184 - это ПРАВИЛЬНО ! |
|
|
|
|
|
- интересный узел и очень полезный -
часто используется во многих
устройствах обеспечивая безотказность их работы :
Измеритель суммарного тока протекающего через драйвер и двигатель - схема его стандартна - 3 транзистора нижнего плеча в драйвере подсоединены к одному проводу, не к "общему" проводу устройства ! А этот провод через токоизмерительный резистор R18 (беленький прямоугольник справа внизу на плате с надписью R100 - значит 0.1 Ом) подключен к "земле" устройства.
Протекание тока I через резистор R вызывает падение напряжения U на нем :
U = I * R ( это закон Ома для участка цепи )
это напряжение фильтруется ФНЧ
(фильтром нижних частот) образованным R20 и C16 и подается на
компаратор
LMV7219M5 - он сравнивает его с напряжением заданным с помощью ЦАП
(сигнал
DAC_OUT) и в случае превышения на выходе компаратора возникает высокий
уровень over_cur - означающий превышение током заданного значения.
Обычно делают проще - используют не компаратор а ОУ
(операционный усилитель) и без сравнения с чем либо усиливают напряжение с
R18 (нормируют
сигнал) и подают на АЦП. Программа МК по результату АЦП судит о величине
тока.
Однако примененная схема с компаратором (его роль может выполнять и ОУ) позволяет быстрее реагировать на превышение тока выше заданного значения - ведь сигнал с компаратора можно подать на один из входов INTx - это ножки МК имеющие возможность прерывать программу МК по внешнему событию. МК при возникновении такого прерывания примет меры для снижения тока - обычно это делается путем изменения величины ШИМ сигнала управляющего "мостом".
Обратите внимание! Для защиты драйверов IR2184 по питанию - предусмотрен защитный диод TVS SMBJ18 - но на плате его нет.
|
|
|
|
|
|
Очень советую ! При проектировании схемы и разводке платы предусматривайте все по максимуму ! а напаять в устройстве можно лишь необходимое. Зато вам будет легко добавить то, что было задумано - ведь место на плате будет предусмотрено заранее ! |
|
|
|
|
|
В АпНоуте AVR492 еще много информации к размышлению и применению и еще есть архив с программой для МК !
Пожалуйста найдите время и просмотрите!
Советую читать курс с начала !
Что такое Микроконтроллер (МК) ?
Почему AVR ?
Главное по устройству МК.
Внешние сигналы.
Как МК решает, что на ножке: "1" или "0"
Ножки - выводы МК - какие они бывают.
Я считаю, что
МК это микросхема (чип, камень, IC) -
которая в ответ на внешние
электрические сигналы действует в
соответствии с :
- возможностями заложенными производителем
- электроникой подключенной к МК
- программой которую в него загрузите ВЫ.
Возможность МК действовать по вашей
программе - вот суть-соль МК. Это главное отличие МК от "обычных" НЕ
программируемых микросхем.
Это семейство МК (Таблица
всех МК AVR) от компании ATMEL
разработанных
с учетом особенностей и
удобства написания программ на языке Си.
Вот ознакомительная статья: Знакомьтесь, господа: AVR !
Вот полное описание МК AVR на русском языке - перевод ДатаШита : AVR ATmega русский ДШ.
Книги и учебники по AVR тут
Это не дорогие, широко доступные, надежные, простые, довольно быстро считающие большинство инструкций выполняется за 1 такт - т.е. при кварце 10 МГц выполняется до 10 млн. инструкций в секунду !
AVR имеют развитую периферию, т.е. набор аппаратуры окружающей процессор-вычислитель в одном корпусе МК или набор встроенных в МК электронных устройств, блоков, модулей.
Вот основные параметры AVR:
- тактовая частота до 20 МГц ;
- встроенный программируемый RC-генератор, частота 1, 2, 4, 8 МГц;
- Flash-ПЗУ программ, программируемое в системе, 10 000 циклов перезаписи;
- EEPROM данных (100 000 циклов) - она не "забывает" при откл. питания;
- внутреннее ОЗУ со временем доступа 1 такт;
- 6 аппаратных команд умножения (для семейства mega);
- развитая система адресации, оптимизированная для работы с С-компиляторами;
- 32 регистра общего назначения (аккумулятора);
- синхронный (USART) или асинхронный (UART) (в mega64 и mega128 их по 2);
- синхронный последовательный порт (SPI);
- двухпроводный интерфейс TWI, совместимый с интерфейсом I2C;
- многоканальный PWM 8-, 9-, 10-, 16-битный ШИМ-модулятор;
- 10-битный АЦП с дифференциальными входами;
- программируемый коэффициент усиления перед АЦП 1, 10 и 200;
- встроенный источник опорного напряжения 2,56 В;
- аналоговый компаратор;
- сторожевой таймер - перезагружает МК при "зависании";
- настраиваемая схема задержки запуска после подачи питания;
- схема слежения за уровнем напряжения питания;
- JTAG-интерфейс для подключения эмулятора (в МК с объемом ПЗУ от 16 кбайт);
- микропотребление (менее 100 мкА в активном режиме на частоте 32 кГц);
- датчик температуры (в ATtiny25 ATtiny45 ATtiny85).
Существуют AVR-ы со встроенными интерфейсами USB, CAN и со встроенными радио приемо-передатчиками.Есть специализированные МК AVR для управления электроприводом электродвигателями - серия AT90PWMxxxx
Очень важный, Добрый совет вам :
Вы начинающий и наверно благоразумно не планируете делать сразу серийное коммерческое устройство, а хотите использовать МК для любительских штучных изделий, Используйте в ваших устройствах какой-то один и тот же "многоногий" МК AVR серии ATmega Желательно один из этих:
ATmega16 - настоятельно рекомендую!
ATmega169, ATmega32, ATmega64
ATmega128 - настоятельно рекомендую! (... а вот он же на мини плате)
- они позволяют выполнить любую задачу любительского уровня (и многие
задачи профессионального уровня - это же серийный МК)
- они поддерживаются симуляторами электронных устройств на AVR - VMLAB (о нем чуть позже и подробней) и супер-пупер симулятором PTOTEUS (он кстати позволяет симулировать и другие МК семейств PIC, 8051, ARM7, Motorola).
- они имеют достаточно оперативной памяти и памяти для вашей программы
- они имеют много выводов (ножек) - это очень удобно !
- они имеют встроенный RC генератор и могут работать без внешнего кварца - достаточно подать питание на новый МК и он "затикает" !
Используйте один и тот же МК и он станет вам "своим в доску" . Вы сможете:
- хорошо изучить его устройство и особенности
- распечатать важные страницы ДатаШита
- не тратить
каждый раз время на изучение особенностей другого
МК,
на поиск "граблей" у новичка,
- у вас будут
накапливаться куски программ уже
проверенных вами
именно на этом МК
- вам будет
ВСЕГДА хватать ножек (выводов) МК и памяти
для программы
Вам будет ОЧЕНЬ удобно работать a это важно для уверенного старта. Вы будете знать всего один МК , но будете знать его очень хорошо !
Не бойтесь
многоногих ATmega с большим количеством "периферии"
(встроенных в МК, полезных, но возможно
не нужных вам пока устройств с непонятными названиями). Все они
изначально - "по умолчанию" обычно отключены и о них можно не думать. Вам нужно
будет позаботится о включении и конфигурации
только
тех из них, которые
понадобятся вам а вашем устройстве.Забегая
вперед скажу что сделать это очень
просто благодаря встроенным в
компиляторы CVAVR и ICC интерактивным
визадам мастерам начальной конфигурации
МК и создающим начальный текст
программы.
Если вы
хотите только помигать для начала
светодиодом - то даже на ATmega128 вам
нужно всего лишь подключить к МК :
- питание от 4 до 5.5 вольт (3 пальчиковых батарейки например)
- 5 проводков на принтерный порт ПК для ISP "прошивания" программы в МК (подробнее об этом на стр. 7 курса)
- светодиод (катод (черточка на схеме) к ножке МК а анод светодиода к + питания МК через резистор 430-750 Ом )
- написать программу мигания светодиодом и загрузить (=прошить=прожечь) её в МК.
Вас совершенно не тронет и не напряжет та "навороченность" что заложена в ATmega128. Она будет тихо ждать пока вы ее не затребуете!
Четкое понимание алгоритма работы устройства это основа - базис для успешной разработки самого устройства и программы для МК !
Напомню: Самая подробная и полная информация по МК содержится КОНЕЧНО же в его ДШ.Он доступен в оригинале и на русском языке.
Подробнее об основах и тонкостях устройства МК AVR и работе с ними читайте в книгах :
об основах и тонкостях электроники и
схемотехники читайте в настольной книге
электронщика: П.Хоровиц,
У.Хилл. Искусство схемотехники - общепризнанная
библия электронщика на РУССКОМ языке.
Уже 5-е издание.
Я уже предупреждал вас выше: МК является микросхемой которая в ответ на внешние электрические сигналы действует в соответствии с возможностями заложенными производителем, электроникой подключенной к МК, программой которую в него загружена, например вами. Разберем по пунктам:
Это напряжения и
токи поступающие к МК от подключенных к нему проводниками
других компонентов электронного
устройства. Важнейший
из них - это напряжение питания МК. МК AVR серии
ATmega могут работать, т.е. исполнять заложенную
в них программу уже при
подаче одного напряжения питания, а
узнать о том что он работает мы можем по
изменению тока потребляемого МК по
проводу питания.
Диапазон
допустимых напряжений питания указан
на первой странице ДШ
и составляет
обычно 4.5 - 5.5 вольт постоянного
напряжения - плюс которого подключается
к выводам VCC МК.
Для МК ATmaga с
буквой L в названии диапазон питания
2.7 - 5.5 вольт - он шире (достаточно
литиевой батарейки или двух пальчиковых)
но зато максимальная частота
тактирования МК в 2 раза ниже и обычно
составляет 8 МГц.
Отрицательный
вывод источника питания подключается к
выводам МК GND и его потенциал
принимается за ноль вольт и
относительно него измеряются все другие
напряжения на ножках МК.
Проводник соединенный с выводами GND МК называют общим
или нулевым или "земля" и на
схеме обозначают специальным символом -
например жирной горизонтальной
черточкой или несколькими
горизонтальными полосками друг под
другом убывающей длины.
Электрические
сигналы это токи
и вызываемые их протеканием
напряжения. Но говоря о
сигналах поступающих в МК мы рассматриваем их как
некоторые
напряжения измеряемые относительно
ножек GND МК. Любой электрический сигнал
является аналоговым т.е.
имеет
определенное значение в каждый момент
времени и если он был 2 вольта а стал 4 вольта то он обязательно принимал все
значения лежащие
между 2-мя и 4-мя
вольтами.
( ВАЖНО ! )В цифровой технике приняты некоторые правила по которым можно представить аналоговый сигнал допустимый для подачи на ножку МК (он должен быть выше -0.5 вольт и ниже чем напряжение питания МК увеличенное на 0.5 вольта, я советую 0.3 вольта ) как 1-битный цифровой сигнал или как одно из двух значений:
"1" - высокий логический уровень (ВЛУ) - логическая единица
"0" - низкий логический уровень (НЛУ) - логический ноль
Эти правила для ножек МК
которые могут быть входами (и кроме XTAL1 и
RESET)
в МК AVR описаны в разделе ДШ
"Electrical Characteristics" и
иллюстрированы графиками :
График 181 из ДШ на МК ATmega16
Показывает зависимость порогового (Threshold) напряжения переключения из "0" в "1" от напряжения питания МК.

Очень важно правильно понять этот график !
Он означает
следующее: Если МК считал напряжение
на ножке (левая вертикальная шкала
графика) логическим нулем и это
напряжение было ниже линии графика, то
при достижения напряжением на ножке
этой линии графика - МК начинает считать
что теперь на ножке присутствует логическая
единица - "1". Значит
теперь в регистре PINX порта_Х
которому принадлежит эта ножка
соответствующий ей бит стал "1" -
единицей (а был "0" - нулем)
Это типовое
значение ! т.е. наиболее вероятное
для вашего МК.
По графику при напряжении питания МК 5
вольт этот порог примерно 1.9 вольт в
диапазоне температур от -40 до 85 градусов.
Но есть еще
и гарантированное значение
напряжения при превышении которого МК
будет считать, что на ножке появилось
напряжение соответствующее логической
единице. Оно равно
60% от напряжения питания МК - для 5
вольт это будет 3 вольта.
Запомните ! Что бы быть уверенным что МК AVR (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "1" вы должны позаботится о том что бы это напряжение было не ниже чем 3 вольта ! Уточняйте в разделе ДШ "Electrical Characteristics" для вашего МК !
График 182 из ДШ на МК ATmega16
Показывает зависимость порогового (Threshold) напряжения переключения из "1" в "0" от напряжения питания МК.

Он означает следующее: Если МК считал напряжение на ножке логической единицей и оно было выше линии графика, то при снижении напряжения на ножке МК до линии графика - МК начинает считать что теперь на ножке присутствует логический ноль - "0". Значит теперь в регистре PINX порта_Х которому принадлежит эта ножка соответствующий ей бит стал "0" - нулем - НЛУ (а был "1" - ВЛУ)
Это типовое
значение ! т.е. наиболее вероятное
для вашего МК.
По графику при напряжении питания МК 5
вольт этот порог примерно 1.3-1.4 вольта в
диапазоне температур от -40 до 85 градусов.
Но опять существует гарантированное значение напряжения ниже которого МК будет считать, что на ножке появилось напряжение соответствующее логическому нулю. Оно равно 20% от напряжения питания МК - для 5 вольт это будет 1 вольт. Что бы быть уверенным что МК ATmega16 (питающийся от 5 вольт) воспримет входной сигнал (входное напряжение) как "0" вы должны позаботится о том что бы это напряжение было не выше 1 вольта !
Запомните:
Напряжение на ножке выше чем 60% напряжения питания МК гарантировано воспринимается им как ВЛУ или "1" - высокий логический уровень
Напряжение на ножке ниже чем 20% напряжения питания МК гарантировано воспринимается им как НЛУ или "0" - низкий логический уровень
Эти пороговые уровни для напряжения питания 5 вольт будут 3 и 1 вольт
Это справедливо для диапазона напряжений питания VCC = 2.7-5.5V
Возникает
вопрос - а чем будет считать МК сигнал 1.7 или скажем
1.46 вольта ? т.е.
как МК интерпретирует напряжение на
ножке между рассмотренными выше
пороговыми уровнями ? Это зависит
от того чему был равен соответствующий
этой ножке бит в регистре PIN_X (т.е. от
того каким ЛУ считал МК напряжение на
ножке) до появления напряжения
попадающего между двумя порогами
переключения - и по приведенным выше
двум правилам - этот бит не может
изменится !
Важный
вывод - любое
изменение напряжения на ножке МК
лежащее между двумя пороговыми
напряжениями не ведет к изменению того
каким логическим уровнем считает МК напряжение
на этой ножке в данный момент !
Внимательно прочитайте и поймите, запомните - все входные сигналы с ножек МК поступают на встроенные триггеры Шмитта (аналогичные двум последовательно включенным элементам микросхемы 74HC14) - это устройства имеющие гистерезис (иначе - разность напряжений) по входному напряжению переключения их выходов из "1" в "0" и наоборот.
По графику 183 в AVR гистерезис составляет примерно 0.57 вольта при VCC 5 вольт

Г истерезис по входному напряжению позволяет отсечь помеху (существующую во входном сигнале и/или наводку - напряжение создаваемое внешними электромагнитными полями в проводнике подводящем сигнал ко входу приемника - в нашем случае к ножке МК) с размахом до величины гистерезиса и четко распознать преобразовать в логические единицы и нули зашумленный цифровой сигнал.
Если подключить двух лучевой осциллограф ко входу и выходу триггера Шмитта и подать на его вход смесь цифрового сигнала размахом 4-5 вольт и шумового сигнала размахом чуть меньше гистерезиса - мы увидим следующую картину: На входе тригера Шмитта будет черти что в котором будет угадываться цифровой сигнал а на выходе будет чистенький прямоугольный цифровой сигнал !(Вы можете смоделировать это в PROTEUS или в MicroCAP)
Подробнее об основах и тонкостях электроники и схемотехники читайте в книге оглавление которой на заглавной странице.
Теперь вы знаете как AVR преобразует напряжения на его ножках в "1" или "0"
1) сигнал сброса RESET - при "0" на этой ножке МК останавливает выполнение программы, содержимое регистров МК становится начальным (см. таблицу регистров в конце ДШ - в основном все биты нули) а все выводы становятся высокоомными входами (говорят: Z - состояние).
После появления на этой ножке "1" и наличии питания МК - выполнение программы начнется с начала, как после включения питания МК Подробней см. в разделе "Resetting the AVR" ДШ. Эту ножку можно ни куда не подключать благодаря внутреннему резистору "подтягивающему" ( подающему ток от источника более высокого напряжения) ее к питанию МК, но я бы посоветовал не оставлять reset в воздухе а "заземлить" конденсатором 0.1 мкФ - а еще лучше и подключить к reset диод типа 4148 черточкой к + питания МК и параллельно диоду резистор 5-12 КОм.
Запомните:
Черточка над названием сигнала: SIGNAL означает что активный уровень этого сигнала "0" - т.е. событие соответствующее ему происходит при НЛУ.
Косая черта / может означать в описании бита :
R/W - если бит "1" режим R а если бит "0" режим W
R/W - может еще означать возможность записи и чтения этого бита
2) питание аналоговой части МК, АЦП (входы ADC_x ) ножка AVCC - ее нужно соединить с выводом VCC питания МК даже если вы не предполагаете использовать АЦП.
3) опорное напряжение для АЦП (входы ADC_x ) ножка AREF - напряжение на ней должно быть от 2 вольт до напряжения питания МК. Напряжение на входах АЦП равное или превышающее AREF будет оцифровываться в код 1023 (давать результат АЦП равный 1023. Всегда желательно заземлять эту ножку конденсатором на 0.1 мкФ. Вы можете использовать внутренний источник опорного напряжения на 2,56 вольт. (МК AVR ATmega имеет встроенный 8-ми канальный (АЦП) Аналого Цифровой Преобразователь - он позволяет преобразовать напряжение на ножках МК подключаемых к АЦП в число от 0 до 1023 - т.е. в 10 битный результат.)
4) ножки для
подключения кварца или керамического
резонатора XTAL1 XTAL2. Для
работы МК необходимритм или
тактирование. Нужен некоторый
периодический сигнал в соответствии с
которым МК сможет шагать по заложенной в него
программе, кроме того тактовый сигнал
нужен для работы периферии МК. Хотя МК ATmega
имеют встроенный источник тактовой
частоты RC-генератор (с завода он включен
на частоту 1 МГц обычно) и к этим выводам
можно ни чего не подключать, чаще требуется более точный источник
тактирования - наиболее популярный это
кварц - правильнее кварцевый
резонатор - его подключают между этими
ножками МК, а с самих ножек подключают
конденсаторы 22-33 пФ на землю.
Важно
установить фьюзы (Fuses) в соответствии с
параметрами нужного вам тактового
сигнала и его источника. Читайте
раздел ДШ "Sestem clock and Clock options" и
таблицу 2. "device clocking options select"
. FUSE (фьюз)
- Это в общем то
обычный бит в регистрах фьюзов но
программа МК не может их изменить. Вы
можете менять их только
программатором.
Фьюз "запрограммирован" - его значение "0"
Фьюз "НЕ запрограммирован" - его значение "1"
С завода МК поставляется с определенной комбинацией фьюзов - все указано в ДШ. Будьте внимательны с фьюзами! Прежде чем менять фьюзы определите точно что вы делаете, иначе вы можете по ошибке отключить режим ISP программирования и МК можно будет перепрограммировать только специальным программатором. Список фьюзов для каждого МК удобно смотреть и устанавливать их состояние в диалоге настройки программирования компилятора CodeVisionAVR.
Вот список комбинаций состояний фьюзов для МК ATmega128 с кратким описанием их назначения:

Не пугайтесь! В большинстве МК их гораздо меньше.
МК ATmega16
поставляется с такой комбинацией 6-ти
фьюзов относящейся к
источнику
тактового сигнала - абзац "Default Clock
Source" :
SKSEL 0001 SUT 10
Это
означает - включен внутренний источник тактовой
частоты - RC-генератор
и генерируемая
частота 1 МГц. Подробней о фьюзах на стр. 7 курса.
О фьюзах AVR рассказано и внизу этой страницы.
По умолчанию в МК включен интерфейс JTAG - поэтому 4 ножки в PORTC не доступны для обычного использования. Чтобы отключить JTAG нужно изменить фьюз JTAGEN в "1". JTAG можно выключить и программно - для этого нужно два раза подряд вписать "1" в бит JTD в регистре MCUCSR в течении 4 тактов МК. Чтобы опять включить JTAG нужно два раза подряд вписать "0" в бит JTD.
Если вам нужно тактировать МК внешним сигналом (например от другого МК в системе или какой либо микросхемы имеющий собственное тактирование) то его нужно подать на ножку XTAL1 , а ножку XTAL2 оставить свободной. Параметры такого сигнала см. в ДШ.
Есть еще выводы и для подключения очень точного но медленного часового кварца - обычно это маленький цилиндрик с двумя гибкими ножками, конденсаторы ему обычно не нужны, да и сам этот кварц нужен если вы хотите сделать например часы реального времени - т.е. он совсем не обязателен.
С учетом занятости некоторых ножек МК под конструктивно заданные функции, количество выводов МК доступных вам для использования меньше чем имеет МК ! МК ATmega16 позволяет использовать 32 ножки из 40 в корпусе DIP. Эти 32 ножки составляют 4 порта МК
Порт в МК - это 8 ножек или линий ввода-вывода (выводов МК или IO или I-O или I/O) имеющие индивидуальные номера от 0 до 7 и общую букву A, B, C, D, ... отличающую этот порт от других.
Пример для PORTB : Порт_B имеет (как и другие порты МК) минимум 3 сопоставленных ему регистра :
DDRB -
значение битов в этом регистре
определяет чем будет ножка этого порта с
номером этого бита - начальное (при
включении МК или после сброса) значение
"0" - ножка вход если сделать
бит = "1" (говорят: установить
бит англ. set bit )
эта ножка станет выходом. если сделать бит
= "0" - говорят: сбросить
или очистить бит англ.
clear bit
PINB - биты этого регистра показывают чем ("1" или "0") считает МК напряжение на ножке порта с номером этого бита. (этот регистр в ATmega16 нужно только читать, записывать в него что либо бесполезно).
|
ВНИМАНИЕ ! В микроконтроллерах
AVR старой серии
AT90s и в ATmega8, -16, -32,
-48, -64, -88, -128,
-168 имеет смысл только читать из регистров
PINx. |
||
PORTB - бит этого регистра нужно сделать "1" или "0" что бы на ножке порта с номером этого бита появился "1" или "0". При этом такой же бит регистра DDRB должен быть "1" - т.е. ножка должна быть выходом. Если она сконфигурирована как вход (т.е. её бит в регистре DDRB очищен или равен нулю) - то если очищен и соответствующий бит в регистре PORTB ножка будет высокоимпедансным входом (Z-состояние, вход с очень высоким входным сопротивлением более 10 МОм), а если бит в регистре PORTB установлен, т.е. равен "1" то включается "подтяжка" (pull-up) высокоимпедансного входа к плюсу питания МК через встроенный резистор примерно 40 КОм - ножку как бы соединяют таким резистором с питанием МК.
"Подтяжку" можно использовать для создания четкой лог. "1" на ножке-входе МК без внешних компонентов. К такому входу вы можете подключить кнопку замыкающую его на "общий" провод устройства - GND - при нажатии. При отпущенной кнопке на входе будет "1" и соответствующий бит в регистре PINx тоже будет "1". При нажатии кнопки ее контакты замкнут вход на GND и на нем станет "0" - соответственно и в PINx появится "0" и ваша программа сможет прочитав PINx определить что кнопка нажата.
Подтяжку на всех портах одновременно можно отключить! Для этого нужно установить бит PUD в регистре SFIOR
Вот Таблица состояния ножки МК при условии подключения допустимой нагрузки - т.е. ток через ножку не превышает 20 мА и при не активности аппаратуры МК использующей данные ножки для своей работы.
|
Значение бита_х |
Состояние |
||
|
Программа может только читать этот бит ! (Отличия для некоторых МК описаны выше) |
Программа
управляет |
PBx |
|
|
PINB.x |
DDRB.x |
PORTB.x |
|
|
1 |
1 |
1 |
Высокий
лог. уровень (вывод как бы
подсоединен к питанию МК резистором |
|
0 |
0 |
Низкий
лог. уровень (вывод как бы заземлен |
|
|
определяется |
0 |
1 |
Подтяжка
- pull-up. |
|
0 |
|
||
Аналогично для порта_C будут регистры: PORTC PINC DDRC
Ножки портов обозначаются в ДШ так:
PB3 - ножка 3 порта_B
PA0 - ножка 0 порта_A
Итак ...
32 ножки IO микроконтроллера ATmega16 могут быть программно и индивидуально сконфигурированы (и переконфигурированы по мере необходимости) как :
1) входы с высоким (более 10 МОм) входным сопротивлением (для напряжений от 0 до напряжения питания МК !) или Z-вход
2) входы по п 1) но с подключенным внутренним подтягивающим резистором на + питания МК (номинал резистора примерно 40 кОм)
3) как выходы способные обеспечить ток до 20 мА (но общий ток на порт только до 80 мА, а ток всех портов до 200 мА в DIP корпусе и до 400 мА в квадратном)
Важно: эти 32 ножки МК имеют и дополнительное функциональное назначение описанное в ДШ и книгах - они являются входами-выходами (пишут: IO или I/O ) и для устройств периферии МК. И при активации какого либо периферийного устройства МК программой, соответствующие ножки МК автоматически конфигурируются ( для PWM не автоматически. Подробней в ДШ) так как требуется для правильной работы этого устройства не зависимо от того как они были сконфигурированы ранее. А после отключения устройства их конфигурация станет такой что была задана последней по тексту программы. (Подробнее в разделе "Alternate Port Functions" ДШ.)
Предположим, что ножки RXD и TXD вы сконфигурировали как входы с подтяжкой (Inputs with pull-up) затем, по ходу работы, программа включила USART на прием (например данных с COM-порта ПК через преобразователь уровней интерфейса rs-232 MAX232) и сразу же ножка RXD станет просто входом (подтяжка уберется) и по ней будут приниматься данные в МК, а вот состояние TXD не изменится и будет доступно программе для изменения как любой другой из 32 линий IO.
А вот если включить USART сразу и на прием и на передачу то ножка TXD станет выходом и не будет доступна изменению программой до выключения передатчика USART.
После выключения USART ножки RXD и TXD снова станут входами с подтяжкой, если конечно в программе не было команд меняющих эту конфигурацию.
Назначение ножек можно изменять по ходу программы в соответствии с реализуемым алгоритмом - т.е. по вашему усмотрению.
Советую:
1) для того чтобы не повредить (не пожечь) выводы МК - подключайте их через резисторы 200 - 360 Ом (если это допустимо по схеме - в большинстве случаев это так) - эти резисторы ограничат ток через вывод МК на допустимом уровне при замыкании элементов схемы на питание или землю. Когда устройство будет отлажено, эти резисторы можно исключить, а можно и оставить - я оставляю.
2) Не подключаемые (не используемые) в вашей схеме ножки МК рекомендуется сделать входами с подтяжкой - это не позволит ножке хаотично менять свое напряжение под действием внешних помех. Такое беспорядочное изменение напряжения вызывает дополнительное потребление тока на внутренние переключения в МК и часто вызывает недоумение большим током потребления в спящем режиме работы МК. Если в программе вы используете режимы пониженного энергопотребления то сделайте неиспользуемые ножки IO входами и соедините их с GND.
Не оставляйте не подключенными выводы в Z-состоянии !
Я обычно стараюсь развести неиспользуемые "подтянутые" ножки на отдельный разъем на плате - сам разъем можно не паять - но в случае необходимости вы сможете легко впаять его и так задействовать эти выводы МК.
Что делать если
внешний сигнал превышает диапазон
напряжений допустимый для ножки МК ?
Ответ прост :
Напряжение сигнала на который должен отреагировать
МК может быть каким угодно большим.
Нам важно чтоб на самой ножке МК он не выходил за допустимый диапазон .
Этот диапазон я указал выше.
Чтобы выполнить это условие очевидно нужно между большим внешним сигналом и ножкой МК поставить какой то элемент на котором будет падать (поглощаться, гаситься) напряжение на которое входной сигнал выходит за диапазон допустимых напряжений для ножки МК. Простейший, обычный вариант - гасящий резистор. Например для определения перехода напряжения сети 220 вольт через ноль (точнее близко к нулю) в системах тиристорного регулирования мощности на ножку МК подают напряжение фазы через два резистора (не чипы) включенных последовательно и имеющих общее сопротивление от 1 до 10 МОм.
Если при этом посмотреть осциллографом напряжение на ножке МК настроенной как Z-вход - мы увидим почти меандр (прямоугольный сигнал с равными длительностями "0" и "1" ) с размахом примерно на 0.7-0.9 вольт больше напряжения питания МК.
Важно! Номинал гасящего (или токоограничивающего) резистора выбирается таким чтобы ток втекающий через него в МК не превышал тока потребляющего работающим МК, иначе возникнет "паразитное питание" МК - этот ток будет повышать напряжение питания МК проходя на вывод VCC МК через встроенные в МК защитные диоды линий (ножек I-O) ввода-вывода.
У каждой ножки I/O (у других ножек не у всех) МК есть два защитных диода - один катодом на VCC а второй анодом на GND. Не надейтесь на серьезную защиту МК этими диодами ! Ток через них не должен превышать 1 мА !
"паразитное
питание" - возможно при питании МК
стандартными стабилизаторами
напряжения типа 7805 78L05 и т.п. так как
они не "сопротивляются" повышению
напряжения на их выходе внешним током! А вот при
питании параметрическими
стабилизаторами - например шунтирующий
стабилизатор типа TL431
или резистор со
стабилитроном - паразитное питание не
возникнет, но можно пожечь
защитные диоды ...
Если вы не
можете поставить большое гасящее
сопротивление,
то поставьте максимально допустимое, затем
стабилитрон на напряжение чуть ниже напряжения питания МК - при питании
5 вольт подойдут стабилитроны типа - 1N4730
1N4731 1N4732.
От стабилитрона на ножку МК поставьте
резистор 1 КОм.
Подробнее про правильное питание ( это очень важно ! ) устройства в целом и МК смотрите в АпНоутах в Книгах и проектах. Про электротехнические расчеты, о схемах деления напряжения, усиления сигнала и его ограничения - читайте в книге оглавление которой на заглавной странице курса.
Другой вариант приведения входного сигнала к диапазону напряжений допустимых для МК (это называется нормирование) - применить усилитель с нужными параметрами. Пример там.
(Прерывания
в AVR - подробно
описаны
на этой странице но НИЖЕ.)
Возможности
заложенные в МК производителем
Они определяются конструкцией МК - и дают вам
шанс реализовать на нем то или
иное устройство и в тоже время
ограничивают вас. Обычно ключевые
моменты устройства МК и его параметры
указаны на первой странице ДатаШита а
полному раскрытию их посвящен весь ДШ, в
частности на второй странице ДШ
показано расположение ножек МК в
различных корпусах и их обозначения связанные
с их дополнительными функциями.
Я ранее уже
перечислял основные устройства
содержащиеся в МК AVR ATmega и называемые
периферией МК. Далее в ДШ
идет подробное описание каждой ножки МК
и затем структурно-логическая схема МК -
то как связаны его модули воедино.
Ограничения
заключаются в том что все устройства
имеют определенные параметры и лучше, быстрее
работать не могут. Вы должны это
знать и правильно подбирать МК соответствующей
вашей задаче. Если
производитель подключил входы АЦП к
конкретным ножкам МК то вы не можете это
изменить - это данность. Тоже относится и
к другим периферийным устройствам - всем
им сопоставлены определенные ножки МК. Однако
некоторые из этих устройств (например
USART, SPI, TWI он же i2c) можно реализовать программно
(старайтесь избегать этого!) и тогда им можно сопоставить
любые не занятые ножки IO.
А
что делать если вам нужно, например 4
интерфейса TWI
(боле известен как i2c от
philips) а в МК AVR он только один ?
Выход
прост - можно применить аналоговые ключи
- мультиплексоры, например компании Analog.com
серии ADGxxx и программно коммутировать (переключать)
ими линию SCL МК на линию SCL одного из 4
интерфейсов TWI используемого в данный
момент. Напомню что на одну линию
TWI ( i2c ) можно поставить несколько
устройств с разными адресами! Аналогично можно поступить и
в других случаях, либо
реализовать дополнительные интерфейсы программно.
Работа МК - шевелить, дергать ножками. Это очень
метко сказано. Нам нужно
получить практический результат работы
МК - обычно это
информационные сигналы поступающие от
него в виде определенных напряжений на
ножках МК создаваемых в соответствии с программой.
т.е. программа работающая в МК
буквально "дергает" его ногами в нужные моменты времени. Для того
чтобы правильно подключить внешние
электронные компоненты принимающие эти электрические сигналы
от МК, важно
знать как напряжения на ножках МК зависят от подключенной к ним нагрузки.
Программа
может "приказывать" МК AVR выводить либо "1" либо "0" на
ножки I/O назначенные выходами. МК
преобразует эти логические уровни в
напряжения на ножках открывая
соответствующий полевой транзистор -
ключ.
Чтобы
вывести "1" открывается
транзисторный ключ
соединяющий ножку МК с + питания.
Чтобы
вывести "0" открывается
транзисторный ключ
соединяющий ножку МК с выводом GND МК.
Если к ножке ни чего не подключено то при выводе "1" на ножке будет напряжение почти равное напряжению питания МК - это VCC - в курсе по умолчанию считаем +5 вольт.
А при выводе логического "0" - напряжение на ножке будет очень близко к 0 вольт - это потенциал GND.
Однако: Если к ножке МК подключить что либо проводящее ток и так "сопротивляющееся" созданию нужных программе выходных сигналов - напряжения на ножках могут уже не достигать потенциалов VCC и GND и значительно! Это связано с тем что открытый полевой транзистор имеет некоторое не нулевое сопротивление и соответственно протекание тока через него вызывает падение напряжения. Значения этого отклонения показывают графики в конце ДШ. (Там есть и другие графики поясняющие работу МК - найдите время разобраться в них! Наверно теперь вы понимаете почему я советую вам использовать один универсальный МК ... )
Вот, к примеру, для ATmega16
График 179 показывает каким будет напряжение на ножке МК при выводе на нее "0" при подключенной нагрузке "тянущей" эту ножку током (в мА на левой вертикальной оси графика) к источнику положительного напряжения :
примечание: бит в регистре PORTx равен "0" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. Из графика видно, что при втекающем в ножку токе равном 10 мА напряжение на ножке МК будет 0.25 вольт, а при токе 20 мА уже 0.45 вольт
|
пример: Вы подключили к ножке МК анодом (где у диода черточка на схеме) светодиод и хотите чтоб через него протекал ток 15 мА. Как рассчитать токоограничительный резистор включаемый последовательно со светодиодом - от его катода к +5 вольт питания МК? Вот так:
|
||
Так как
линия графика почти прямая до 20 мА -
можно вычислить внутреннее сопротивление ключа
обеспечивающего вывод низкого
напряжения на ножку МК - это примерно 24
Ома. (нужно напряжение разделить на ток).
График 177 показывает каким будет напряжение на ножке МК при выводе на нее "1" при подключенной нагрузке "прижимающей" эту ножку током (в мА на левой вертикальной оси графика) к "земле" т.е. к нулю вольт :
примечание: бит в регистре PORTx равен "1" а бит в регистре DDRx установлен т.е. равен "1" - значит ножка сконфигурирована как выход. По этому графику можно определить что при токе "на землю" в 10 мА на ножке МК будет не 5 вольт а примерно 4.75 вольт - это соответствует подключению резистора 475 Ом от ножки МК на GND.При токе 20 мА напряжение на ножке будет 4.5 вольт примерно - это соответствует подключению к ножке МК резистора 225 Ом.
|
Значит резистор 240 Ом гарантирует не превышение тока через ножку МК более 20мА при замыкании его на VCC или GND. |
|
|
Пожалуйста хорошо усвойте что означают эти графики - вы будете знать что реально будет на ножках МК когда вы ими "шевелите" - т.е. выводите на них нужные вам сигналы. Я уже говорил ранее что все сигналы аналоговые и поэтому изменение напряжения на ножках МК не происходит мгновенно. Фронт сигнала (переход из "0" в "1") и спад сигнала (переход из "1" в "0") не вертикальные линии, а наклонные ! Наклон этот тем больше чем выше емкость нагрузки подключенной к ножке. Это связано с тем что для изменения напряжения на конденсаторе (на емкости) требуется изменение его заряда - а изменение заряда равно произведению протекающего тока на время протекания (точнее интеграл тока по времени), так как все эти величины имеют конкретные конечные значения то и время переключения не равно нулю.
вывод: Стремитесь к разумному уменьшению емкостей того что подключено к выходам МК
Если же емкость уменьшить не возможно - например ножка МК управляет затвором мощного полевого транзистора (затвор это по сути конденсатор) то поставьте между ними резистор хотя бы на 100 Ом.
|
Если вам нужно получить ток превышающий 20 мА Вы можете объединить несколько ножек МК вместе - лучше через токо-уравнивающие резисторы 20-33 Ом А можно применить какие либо внешние буферные микросхемы с более высоким выходным током, например счетверенный Операционный Усилитель (ОУ) AD8534 обеспечивает выходной ток до 250 мА |
||
МК это микроКомпьютер и он тоже может зависнуть ...
В
результате не совершенства созданной вами программы или под влиянием внешних
"злых сил" а может и по вашему умыслу МК
может зависнуть. Для
воскрешения зависшего МК в нем
предусмотрено специальное устройство - Сторожевой
таймер - Watchdog Timer (сокращенно WDT)
- это таймер который тактируется (т.е.
ведет отсчет) своим собственным встроенным
в МК RC-генератором с частотой
примерно 1 МГц. WDT - активируется
специальным фьюзом при
программировании МК и затем программа
может выключать и включать его (фьюз
конечно не меняется при этом) через
регистр управления сторожевым таймером
- Watchdog Timer Control Register – WDTCR В
этом же регистре делают установку
времени через которое WDT
перезагрузит МК путем установки
коэффициента деления частоты
задающего генератора . Если WDT
активирован то вы должны в своей
программе расставить команды обнуления
его счетчика
#asm("wdr")
//так
в компиляторе CodeVisionAVR
так часто чтобы
обнуление WDT происходило через
промежутки времени ГАРАНТИРОВАНО
меньшие чем время переполнения таймера WDT
- я советую расставлять такие команды
так часто насколько возможно.
В соответствии с ДШ Table 17. Watchdog Timer Prescale Select время от обнуления до переполнения WDT и вызванного этим сброса МК (т.е. рестарта его программы с начала) может быть установлено вами программно от 16 мСек до 2 Сек.
Предположим вы установили это время 16 мСек и пока программа в МК не зависла, она исправно обнуляет за счет предусмотренных вами команд.
#asm("wdr")
Но вот МК
завис
- теперь как только WDT
переполнится (не позднее чем через 16
мСек с последнего обнуления) произойдет
перезагрузка МК и программа начнет свою
работу снова. При этом
будет установлен специально обученный бит
прочитав который программа сможет при
необходимости определить причину
сброса, перезагрузки МК - в
данном случае сброс по переполнению WDT.
|
Хорошая
новость:
|
||
Далее
...
Электроника
подключенная к МК
МК обычно располагается на плате, среди
других электронных компонентов, для
удобства рассмотрения я условно делю их на
группы:
1) задача первой группы отсечь опасные токи и напряжения для защиты схемы и нормировать сигналы подлежащие обработке в МК к виду допустимому и понятному для МК и ещё наиболее удобному для обработки средствами содержащимися в МК. Например: вам нужно обработать сигнал датчика тока - с максимальным током в 2А.
При токе 2 А падение напряжения на резисторе в 0.1 Ом будет всего 2 * 0.1 = 0.2 вольта - если подать такой сигнал на АЦП МК ATmega (а рекомендованное минимальное опорное напряжение для него - 2 вольта и тогда 2 вольта это код АЦП 1023) то оно будет преобразовано в код 102 а меньший ток в еще меньший код. Значит несмотря на то что АЦП имеет разрядность в 10 бит вы получите результат лишь в 7 бит примерно - грубовато...
Очевидно
нужно усилить сигнал с датчика тока в 10
раз - до 2-х вольт и мы получим оцифровку
тока с разрешением 10 бит - это и
называется нормирование сигналов -
предварительная их подготовка.
К понятию нормирования
сигналов - относится и различная фильтрация
сигналов для выделения интересующего
участка спектра сигналов подлежащих
обработке.
Пример:
задача 9_b "Фильтрация и
нормирование измеряемого сигнала перед
подачей на АЦП".
|
Хорошая новость: МК ATmega16 -32 -64 -128 и некоторые другие имеют встроенный усилитель входного сигнала в 10 и в 200 раз. Этот усилитель симулирует PROTEUS но не симулирует VMLAB. |
||
Например еще раз: вам нужно передавать в МК информацию от COM-пота ПК - но сигналы USART MK "перевернуты" относительно COM-овских и напрямую связать их неправильно! Оптимальное решение поставить специальную микросхему MAX232 или ее дешевый и доступный аналог - который можно найти на rel.ru по запросу: *232*
С помощью этой микросхемы вы согласуете физические уровни (проще - напряжения) сигналов ПК к уровням требуемым USART МК (ножка RxD) - можно сказать нормируете их. Тоже делает и "шнурок" для сотового телефона
2) другая часть электроники подключенной к МК предназначена для обеспечения стабильного и достаточно "чистого" питания МК
3) группа электронных компонентов
подключенных к МК и обеспечивающие вывод в том или ином виде результата его
работы.
Примером может быть также микросхема MAX232 но теперь нормирующая сигнал от USART МК (ножка TxD) для того чтобы его принял и понял COM-порт ПК.
Конечно
существует большое количество других
устройств которыми может управлять МК
непосредственно или через специальные
микросхемы интерфейсы или драйверы -
Тиристоры, Симисторы, Транзисторы,
элементы индикации, радио модули и так
далее.
Важно! Все перечисленные группы внешних компонентов общаются с внешним миром. А в мирУ бушуют страсти, трещат статические разряды !!! т.е. нужно предусматривать элементы защищающие от вредного воздействия окружающей среды. И сами силовые элементы управляемые МК и коммутирующие большие токи так же могут являться источником помех.
Это деление "обвязки" МК на группы чисто условное, и конечно элементы любой группы могут не только передавать или принимать информацию (сигналы) на МК но и обмениваться с ним - это микросхемы памяти, LCD дисплеи, другие микросхемы сообщающие МК тем или иным способом о том что в них происходит.
|
О защите входов и выходов МК и устройства в целом я рассказываю в задаче-упражнении 9. Там же пример нормирования входного сигнала с датчика. Подробней о защите читайте на сайте очень полезном для начинающих электронщиков микроконтроллерщиков эмбедеров caxapa раздел: схемы - защита. |
||
Interrupts
- прерывания,
очень важная и мощная функция МК AVR ATmega ATtiny.
Иногда
требуется максимально быстрая реакция программы на какие-то события. Например
приход данных на USART или завершение АЦП
или изменение уровня на ножке МК подключенной к
контактному датчику или переполнение
таймера ... Быструю
реакцию обеспечивает механизм
прерываний. При
возникновении события которое может
вызвать разрешенное в данный момент
времени прерывание и при ГЛОБАЛЬНОМ
разрешении прерываний (бит7 в регистре
SREG "установлен"), выполнение
программы МК останавливается,
сохраняются (запоминаются) место
остановки и некоторые нужные данные, бит7
в регистре SREG обнуляется, очищается флаг
сработавшего прерывания и затем
происходит вызов и выполнение функции
обработчика данного прерывания.
От момента
наступления события до начала
выполнения функции обработчика
прерывания проходит не менее 4 тактов
процессора. Т.е. Скорость реакции на
прерывание напрямую зависит от частоты
на которой работает МК !
|
В регистре SREG есть бит7 называется он " I "
Флаг прерывания - это просто бит который становится "1" (устанавливается) при возникновении события которое может вызвать прерывание не зависимо от того разрешены ли прерывания ГЛОБАЛЬНО (установленным битом 7 в SREG) или индивидуально - т.е. флаг устанавливается даже если прерывание не обрабатывалось программой и не было разрешено. Что бы сбросить флаг прерывания нужно записать в него "1" Программно установить бит-флаг НЕВОЗМОЖНО ! |
||
|
|
Если программа находится в функции обработчике прерывания и в этой функции не был установлен бит SREG.7 то другие события вызывающие прерывания не могут уже вызвать прерывание программы и их обработку.
Делайте функции обработчики прерывания как можно короче ! Не засиживайтесь в них ...
Если
сейчас произойдут события которые могут
вызвать прерывания то установятся их
флаги, но даже разрешенные прерывания не
произойдут !
Нужно тщательно продумывать
алгоритм программы
чтоб успевать обрабатывать все прерывания
- т.е. не пропускать нужные
события.
В конце функции обработчика прерывания
компилятор ставит инструкцию RETI после
выполнения которой бит7 в регистре SREG
становится "1" - т.е. прерывания
опять ГЛОБАЛЬНО разрешаются и программа
продолжает выполняться с того места где
она была в момент возникновения
прерывания. НО
! Если при глобальном разрешении
прерываний обнаружится установленный
флаг разрешенного прерывания, то будет вызвана
функция обработчик этого прерывания. Такая
ситуация может возникнуть если во время
выполнения обработчика прерывания
возникло другое прерывание - т.е.
установился его флаг. Если
возникнет несколько разрешенных
прерываний одновременно то первым будет
выполняться то которое выше в списке
векторов прерываний МК в ДШ. Соответственно
по мере отработки накопившихся и
разрешенных прерываний их флаги будут
очищаться. А вот
флаги неразрешенных прерываний не
очистятся пока программа этого не
сделает записью в них числа 1. Вы можете
запрещать и разрешать как все
прерывания сразу, так и каждое по
отдельности!
Все сразу - изменяя бит7 в регистре SREG вот такими строчками в компиляторе CodeVisionAVR:
#asm("sei") /* бит_I сделать "1" теперь разрешенные прерывания будут обрабатываться, если есть установленный флаг прерывания то произойдет вызов его функции обработчика */
#asm("cli") /* бит_I сделать "0" запретить все прерывания ГЛОБАЛЬНО. */
По отдельности рулить
прерываниями сложней это ДШ надо
читать ...
или хотя бы
русское
описание AVR
Прерывания
легко настроить интерактивно и главное ПРАВИЛЬНО с помощью мастеров
начального кода компиляторов CVAVR и ICC.
Как использовать
мастер начального кода показано в упражнениях курса
В МК AVR и других, прерывания могут
возникать по многим событиям:
- изменение уровня на некоторых ножках МК
- "0" на некоторых ножках МК
- переполнение таймеров
- "насчитывание" таймером определенного значения
- завершение АЦП преобразования
- изменение уровня на выходе компаратора
- события в USART
- другие события ...
В общем снова - читайте ДатаШит .. Для ATmega16 прерывания перечислены в таблице 18 "Reset ana Interrupt Vectors"
|
Примеры объявления функций обработки прерываний в популярных компиляторах: в CodeVision: в ICC :
#pragma
interrupt_handler timer0_ovf_isr:7 просто
указываем компилятору название
функции timer0_ovf_isr которая будет вызываться при
возникновении прерывания №
7. в WinAVR:
#include <avr/interrupt.h> В примерах слово "прерывание" нужно заменить на название прерывания из ДатаШита либо из заголовочного файла *.h для используемого МК. |
||
|
|
Скачайте и запустите проект: Демонстрация механизма прерываний в AVR
Программировал в CVAVR и симулировал в VMLAB.
К ножкам-входам внешних прерываний INT0 INT1 INT2 ATmega16 я подключил резисторы по 10 КОм к + питания МК для создания внешней подтяжки и еще подключил три кнопки 0, 1 и 2 в "Control Panel" симулятора. Нажимая кнопку мышкой можно замыкать соответствующую ножку на "землю" создавая на ней "0" на время пока кнопка нажата. Когда кнопки не нажаты на ножках "1".
Конфигурировал прерывания и USART с помощью мастера генератора начального кода CVAVR.
Прерывания INT0 INT1 разрешены и сконфигурированы "по любому изменению уровня" - т.е. прерывание может возникать и по фронту ("0" -> "1") и по спаду ("1"->"0") сигнала на ножке PD2 и PD3 соответственно.
Прерывание INT2 не конфигурировал - оно оставлено "по-умолчанию" т.е. отключено.
Откройте проект vmlab.prj в VMLAB и сделайте "ребилд-ол"
В меню View откройте, если их нет на экране, панели "регистры и флаги" "SCOPE" и "Control Panel" - разместите их поудобней.
Теперь нажмите несколько раз на светофор - чтоб прекратились меседжи и симуляция шла непрерывно. Кликните по панели "регистры и флаги" чтоб вывести ее на передний план.
Теперь нажмите кнопку K2 и отпустите.
Посмотрите в панели "регистры и флаги" в регистре флагов GIFR (обязательно почитайте об этом регистре в ДатаШите) установился бит_5, если навести на него мышку то появится его название - INTF2 - это флаг прерывания INT2. Вы видите что хотя мы не включали это прерывание его флаг установился при событии соответствующем ему. Как я вам и обещал выше !
Теперь (симуляция продолжается, время с начала программы МК в правом нижнем углу бежит...) нажмите K0 в панели "Control Panel" сразу же произойдет разрешенное прерывание, и программа перейдет в функцию обработчик прерывания INT0 и в виртуальном терминале TTY появится сообщение:
int0
Отпустите K0 и нажмите K1 отпустите K1
Смотрите: так как мы находимся в отработке паузы 100 мС в обработчике прерывания от INT0. Бит_7 в SREG остается "0" и значит прерывания не исполняются. Все правильно - но отпускание кнопки K0 вызвало установку флага INTF0 а нажатие и отпускание K1 установило флаг INTF1.
Если теория прерываний изложенная мной выше верна то по завершении текущей обработки прерывания INT0 должны произойти еще по 1 вызову обработчиков прерываний INT0 и INT1 - причем сейчас МК не "знает" какое из них случилось первым и значит будет обрабатывать их по порядку перечисления в таблице 18 ДШ.
Ждем не долго ... появляются с некоторой паузой одно сообщение и затем другое свидетельствующие о вызове соответствующих обработчиков прерываний:
int0
int1
При этом вначале очистится бит INTF0, а затем INTF1.
Вопрос для самоконтроля: Почему
нажатие и отпускание кнопки K0 вызвало
две обработки прерывания INT0, а от кнопки
K1 только одно ?
Попробуете симуляцию снова и измените
порядок нажатия кнопок: вначале K1 а
затем K0 - и вы увидите что последние
два прерывания все равно будут
выполнены в том же порядке: int0
и затем int1
Важно ! Из примера выше следует что Накопление не обработанных прерываний крайне не желательно так как МК "не помнит" последовательность возникновения соответствующих событий ! Практическое применение прерываний будет рассмотрено в задачах - упражнениях курса.
Я
постулировал ранее что - Возможность
МК действовать по вашей программе - вот
суть-соль МК. Это главное отличие МК от
"обычных" непрограммируемых микросхем.
Я уже рассказал выше
- о внешних электрических сигналах поступающих на МК
- про электронику подключенную к МК
- о возможностях заложенных производителем
AVR ATmega содержит многократно программируемую FLASH память программ - в нее загружается (есть различные варианты прошивки, загрузки программы - достаточно пяти проводков от LPT-порта к МК) программа которую будет исполнять МК при наличии следующих условий:
1) есть
питание МК
2) есть уровень "1" на выводе Reset
3) есть источник тактового сигнала
4) нет сброса от иного источника сброса (==
перезагрузки
МК)
При наличии
этих условий МК начинает шагать по
программе которая представляет из себя
последовательность инструкций которые
может выполнять МК иногда прерываясь
так как было описано выше.
Даю определение - запомните : Программа взаимодействует с МК записывая, изменяя в нужное время числа в регистрах МК и читая в нужное время числа из определенных регистров. Важно понимать - Именно взаимодействует с МК, а не просто управляет! То что содержится в регистрах МК влияет на ход выполнения программы если она это предусматривает.
О как ! ... да что ж это за регистры такие, будь они не ладны!
Регистр (Register) MK AVR - это набор из 8 бит т.е. 1 байт. Как бы ящичек с 8-ю ячейками с номерами от 7 до 0. В этих ячейках находятся 8 бит этого регистра.
|
bit 7 |
bit 6 |
bit 5 |
bit 4 |
bit 3 |
bit 2 |
bit 1 |
bit 0 |
бит7 самый левый - MSB - наиболее значимый бит, старший бит.
бит0 самый правый - LSB - наименее значимый бит, младший бит.
Бит может иметь значение "1" или "0".
8 бит
составляют байт и могут хранить
десятичное
число от 0 до 255
другие
формы записи этого диапазона чисел
таковы:
в 16-тиричном
виде: от 0 до 0xFF или от $0 до $FF или от
0h до FFh
в двоичном виде от 0b00000000 до 0b11111111
Число которое находится в регистре - есть значение регистра.
Значение в
регистре вычисляется как сумма
составленная из восьми
таких слагаемых :
(значение бита) умножить на (2 в степени равной номеру бита)
Пример:
- если бит 7 равен "1" то он добавляет
в сумму число 128 (это 2 в 7-й степ.)
- если бит 4 равен "1" то он добавляет в сумму число 16 (это 2 в 4-й)
Теперь вы видите почему бит 7 называется "мост сигнификант бит" - MSB - наиболее значимый бит, старший бит.
Если некоторый бит равен "0" он конечно ни чего не добавляет в сумму.
|
Запись бит_Х означает что речь идет о бите с номером Х Запись бит_5_2 или бит 5..2 и подобные означают что речь идет о нескольких битах, тут: 5 4 3 и 2 |
||
Регистры в других МК бывают и 16 битными и больше! но лучше говорить: шире.
в МК AVR есть 32 регистра общего назначения из которых 6 регистров R26 - R31 (или R26_31) могут быть виртуально объединены в пары и таким образом получается три 16-битных регистра.
Регистры МК имеют индивидуальные, уникальные адреса и наименования которые обычно образуются из их полного названия в ДШ (DS, DataSheet). Полное название регистра соответствует назначению регистра.
Например:
полное название регистра - Watchdog Timer Control Register
сокращенное название – WDTCR
назначение регистра - управление
сторожевым таймером
адрес регистра WDTCR - $21 или 0x21
Такой же
принцип соблюдается в именовании отдельных битов регистров.
Например:
название бит - Bits 2..0 – Watchdog Timer Prescaler 2, 1, and
0
сокращенное название – WDP2, WDP1, WDP0
назначение регистра - биты
установки коэффициента деления
тактовой частоты сторожевого таймера
При
программировании на языке Си вы можете в программе обращаться к регистрам МК по их названию в ДШ - это удобней чем помнить
абстрактные числа - адреса регистров. Например
так:
PORTB++;
//
добавить 1 в значение регистра PORTB
PORTA = 135; //
записать число 135 в регистр PORTA
PORTA ^= (1 << n);
/* изменить
бит_n в
регистре PORTA
я специально
написал этот комментарий
в несколько
строк для примера
*/
Все
регистры МК в таблице в конце ДШ !
Там же названия всех бит
в регисторах, их номера и страницы ДШ на которых они описываются.
Вот пример
схемы -- устройства регистра WDTCR из ДШ

Регистры целиком либо отдельные биты могут быть:
- R/W можно
читать и записывать (== изменять)
- W можно только записывать в него
- R можно только читать,
записать в него не получится.
Initial Value - это то что будет в регистре после включения питания или после появления перехода из "0" в "1" на ножке Reset или после прекращения сброса МК от другого источника. После такой схемы регистра в ДШ идет подробное описание функций каждого бита !
Обязательно
разберитесь с регистрами ! они являются
средством общения программы с МК
т.е. РЕГИСТРЫ очень важны.
Белых
пятен быть не должно !
Программа не может измерить уровень существуют на ножке МК, но она может узнать об этом прочитав значение соответствующего бита в соответствующем регистре !
Например так :
if (PINB.5)
{ сделать что-то };
/*
если
на ножке PB5 есть "1" (не "0"
значит "истинно") то программа
сделает
что-то, а если на ней "0" (значит "ложно")
то не сделает, а просто пойдет дальше, на
следующую строку
*/
Дойдя до этой строчки программа проверит чему равен бит_5 в регистре PINB - в нем МК сохраняет результат преобразования напряжения на ножках порта_В в логические уровни "0" или "1" по правилам о которых я рассказал уже ранее - и по результату проверки программа будет действовать далее.
while (PINA.6)
{ делать что-то };
/*
пока
на ножке PA6 есть "1" (не "0"
значит "истинно") то программа
будет делать
что-то, и
опять проверять что на PA6
*/
Дойдя до
этой строчки программа проверит чему
равен бит_6 в регистре PINA - если он
"1" то выполнит то что в скобках
{ } затем опять
проверит этот бит. Так программа будет
работать пока не будет прерывания либо
пока бит_6 не станет "0".
Если бит_6 стал "0" то программа
пойдет дальше не выполняя того что в
{ }
Значит так вы можете ввести в программу ожидание нажатия кнопки замыкающей ножку PA6 на "землю" (только обеспечив "1" на ножке при отпущенной кнопке).
while (PINA.6);
/*
пока
на ножке PA6 есть "1" программа будет
выполнять эту строчку.
Когда возникнет "0" программа
перейдет на следующую строку программы.
*/
Если
вы уже "въехали" или "въезжаете"
то надеюсь поняли
что регистры PIN_Х
должны быть ReadOnly - "только чтение"
- ведь значения в них может определять только
сам МК по реальным уровням напряжений на
соответствующих ножках.
Программа может только читать из этих регистров.
Если не понятно - перечитайте пожалуйста ! Не оставляйте на потом !
Книги и учебники
по электронике и микроконтроллерам AVR
Это 4-я страница краткого курса. вы уже должны представлять себе
1) что такое МК AVR и в чем его особенности
2) как МК взаимодействует с электроникой подключенной к нему
3) как МК преобразует напряжения на его ножках в "1" или "0"
4) что является посредником в общении программы с МК
5) какие напряжения на своих выводах может создавать МК AVR
6) с чего нужно начать разработку эл. устройства
7) какая документация по МК особенно полезна и необходима
8) где найти книги и дополнительные материалы
Если вы читаете курс не первый раз и все равно не можете ответить на эти
вопросы - наверно вам нужно остановится и попробовать найти ответы в
прочитанной части курса либо в книгах.
Иначе понимание дальнейшего материала курса может оказаться затруднительным.
Итак ...
- вы определились с тем какое электронное устройство творите,
- понимаете что оно должно делать,
- нарисовали схему
устройства физически способную выполнить вашу задумку !
- например слепили из
кусочков взятых в ДШ, АпНоутах, опираясь на
аналогичные
проекты других
электронщиков найденные
в интернете и по
советам других радио Губителей.
Пора создавать программу которая, будучи загруженной (зашитой, прожженной) в МК, будет изменять физическое состояние его внутренностей и ножек делая записи в регистры МК и узнавать о физическом состоянии содержимого МК читая его регистры с целью выполнения задуманного вами.
Регистры... регистры... регистры...
Короче - хотите
что-то включить, выключить, поменять в МК - найдите в ДШ те регистры и
биты которые за это отвечают
и выясните что именно нужно записать в них ! и
у вас все получится...
Особенно просто и правильно вы этого добьетесь с помощью мастера интерактивного создания кода программы. Про мастер начальной конфигурации МК написано ниже.
Программу для МК удобно создавать в специальных программах
- называются они компиляторы. Если
кроме компилятора в пакете есть отладчик-симулятор и/или программатор то
это уже IDE (интегрированная среда разработки).
Компилятор позволяет написать программу для МК на универсальном языке
программирования - одинаковом и для ПК и для различных МК
(кстати для МК требуется всего 3-5% всех возможностей языка
программирования).
Текст программы набранный вами (или другими добрыми людьми) в компиляторе
называют исходным кодом (или исходником или сырцом - англ:
source code)
Компилятор по вашей
команде проверяет отсутствие ошибок в набранном исходнике и, если ошибок
нет, преобразует исходник (компилирует его) в специальный файл обычно с
расширением .hex - его называют "прошивка".
Прошивку с помощью программатора (для AVR это
например 5 проводков с параллельного порта ПК) помещают во FLASH
память программ МК и при необходимости частично в его EEPROM.
Очень трудно написать
программу сразу правильно и без ошибок
поэтому - Важнейшим этапом
разработки электронного устройства является отладка программы МК (программа
МК называется - firmware).
Для отладки вы :
- включаете ваше устройство с прошитым МК (либо симулятор МК)
- находите
отклонения от требуемого алгоритма вызванные ошибками проги,
- выявляете
хитрыми способами эти ошибки,
- вносите соответствующие изменения в исходный
текст программы
- опять компилируете
- прошиваете новый
.hex
в МК и опять на верхний пункт этого списка
И так до победного конца - т.е. до тех пор пока устройство заработает так как вам нужно.
Не всегда допустимо
включить устройство не зная наверняка правильно ли работает программа МК
- в некоторых случаях могут произойти серьезные и дорогостоящие
повреждения обвязки МК и другой аппаратуры.Иногда требуется проверить
работу МК не имея его и
вообще какой либо реально спаянной схемы и самого МК. В этих
случаях я рекомендую использовать специальные программы - Симуляторы. Симулятор
приблизительно
моделирует на ПК работу "прошитого" вашей программой МК и его обвязки -
т.е. электронных компонентов окружающих МК по схеме устройства. Кроме
того симуляторы позволяют вам:
- останавливать программу когда нужно - в ручную и автоматически
- выполнять программу по шагам
- видеть как именно происходит выполнение программы
- наблюдать и изменять значения в регистрах МК
- наблюдать текущие значения переменных
- использовать виртуальные измерительные приборы с памятью
- симулировать работу МК с обвязкой включающей различные электронные компоненты и устройства
- виртуально обмениваться информацией с терминалом на ПК
- делать еще много полезного !
Теперь подробнее ... Компиляторы Си для AVR
Не пугайтесь! я не предлагаю вам изучить еще и язык Си - мы просто будем использовать несколько инструкций из него - как я говорил всего несколько процентов языка. Я сам начинал изучать и применять МК сразу на Си - и очень доволен результатом. Считаю, что :
Для начинающих наиболее удобен в работе
компилятор Си для
AVR CodeVisionAVR
( или CVAVR)
Вам нужно скачать и установить эту программу!
(демо-версия доступна с
официального сайта (< 4 Мб))
Полную версию можно найти на заглавной странице курса.
Компилятор содержит очень понятный и
очень мощный генератор начального кода программы по вашим потребностям в
конфигурации периферии МК AVR - называется он :
CodeWizardAVR
|
|
Вам нужно просто
выбрать МК, частоту тактирования, затем
открыть ярлыки тех устройств МК которые вы будете использовать и
установить нужные параметры их работы.
Затем мастер ("визад") создаст
файл проекта .prj и файл исходного текста программы на
языке Си с расширением .c - в нем уже будет содержаться код на Си
конфигурирующий МК по сделанному вами "заказу". Вам нужно будет добавить
лишь код реализующий нужный вам алгоритм работы устройства.
Используйте этот мастер и далее по ходу работы программы
- точно так же как и в начале, но не генерируйте новые файлы а просто
откройте меню "файлы - просмотр" и посмотрите нужный кусок программы на
Си, возьмите что вам нужно и вставьте в вашу программу.
|
Подробно и с картинками работу с КодВизадом - мастером начального кода CodeVisionAVR я описал в задаче 1 |
||
Обязательно читайте Help к компилятору - по сути это одновременно и учебник по Си для AVR и именно в нужном вам объеме ! Это относится и к другим используемым вами программам. Читайте инструкцию и помощь ! Смотрите пробуйте изучайте ПРИМЕРЫ к программе !
Компилятор CodeVisionAVR имеет и встроенный программный модуль для прошивки МК и конфигурирования фьюзов прямо в схеме Компания Atmel подсказывает как начать работать с этим компилятором Си для AVR: AN AVR033 "Getting Started with the CodeVisionAVR C Compiler".
Это АпНоуто Atmel - надеюсь вы уже скачали хотя бы их список ! Если нет то скачайте обязательно их перечень.Они ВСЕ нужны ВАМ !!! как справочник конкретно по AVR.
Для
полного цикла разработки устройства достаточно только одного компилятора
CodeVisionAVR.
Однако, я рекомендую вам,
скачать
еще один компилятор: ICC
AVR от компании
Imagecraft
Я использую
и его генератор начального кода на Си - конфигуратор периферии AVR - в
паре с CodeWizardAVR.
Работая в паре, два мастера
конфигурирования МК - идеально дополняют друг друга! Например
конфигурация Таймеров МК по моему лучше, понятней и наглядней сделана в
мастере ICC.
Atmel - подсказывает как начать
работать и с этим компилятором Си для AVR в Апликейшн Ноуте: AN
AVR031 "Getting Started with ImageCraft C for AVR"
|
В компиляторах есть отличные примеры программ на Си для наиболее часто встречающихся задач на МК в CodeVisionAVR
примеры в папке - CVAVR\Examples Не забывайте и вы комментировать тексты ваших программ. Иначе, буквально через пару месяцев, вам будет очень затруднительно понять, что делает тот или иной кусок даже ВАШЕЙ программы! |
||
Существуют и другие
компиляторы. БЕСПЛАТНЫЙ
и великолепный
WinAVR
(размер 25 Mb) - по честному бесплатный пакет на
основе
компилятора GCC - о нем очень хорошие отзывы.
Создает очень правильный и компактный код!
Есть версия и под Linux. Есть вариант
WinAVR в USB-флэшке.
Этот компилятор хорошо интегрируется с симулятором VMLAB
и фирменным симулятором Atmel -
AVRstudio
(о симуляторах ниже и в самом низу страницы)
Вы ставите на ПК
WinAVR
и забываете о нем! Вся работа идет из
симулятора VMLAB - в нем есть пример такой интеграции, находится
в папке: C:\VMLAB\WinAVRdemo
Работать с самим WinAVR тоже очень просто.
Компиляция проекта в WinAVR
- запустите "пуск" -> "WinAVR" -> "Programmers NotePad"
- откройте демо проект C:\WinAVR\examples\demo\demo.c
- затем меню "Tools"
и "Make All"
Проект
откомпилируется и в папке C:\WinAVR\examples\demo\ появятся:
demo.hex - файл для прошивки в МК st
demo.lst - это листинг на ассемблере с привязкой к Си коду программы
demo.elf - файл содержит информацию для отладки программы в симуляторе. Например в PROTEUS.
Подробней о WinAVR читайте в низу этой страницы.
AtmanAVR C/C++ Compiler AVRGCC - он как и WinAVR основан на GCC но имеет отладчик и ГЛАВНОЕ для начинающего: прекрасный генератор начального кода !
Самый лучший и дорогой - IAR - требует несколько замысловатой настройки, не имеет множества примеров в инсталляции и не имеет генератора начального кода. Хотя компания IAR явно считает генератор полезным, так как продает его в виде отдельного программного продукта. Компилятор IAR генерирует самый быстрый и компактный код. Demo версия на 30 дней - полностью рабочая без ограничений, нет только не нужных начинающему исходников включенных в пакет библиотек. Вы можете скачать DEMO с сайта производителя - примерно 65 Мб.
|
Примеры программ на Си подходят с незначительными изменениями для любых компиляторов и для любых МК ! Так как язык Си машино не зависимый - т.е. программы мало зависят от того для какого процессора они написаны. Огромное количество НУЖНЫХ исходников (примеры программ) для AVR на Си здесь - AVRLib можно скачать все одним ZIP-архивом. |
||
Вы скачали компилятор
Си для AVR
CodeVisionAVR и
АпНоуты инсталлировали его и получили файл прошивку для
МК. Естественно вы хотите узнать -
будет ли прошивка, а значит ваша программа работать в МК так как вам
нужно. Для этого удобно использовать специальные
программы для ПК называемые симуляторами.
Не имея МК, не покупая эл. компонентов и без пайки. Без
риска спалить что либо
Вы можете проверить работу
не только программы загруженной в модель МК но и работу модели целого
электронного устройства. Записать на диск результат его работы для
последующего анализа, поиска недочетов.
В задачах-упражнениях курса я использую Бесплатный симулятор-эмулятор для AVR - VMLAB (скачайте и установите на ПК)
Несмотря на небольшой размер (около 4.2 Мб), программа является
самостоятельным средством разработки ПО на ассемблере для МК сразу двух
производителей: ATMEL.com и ST.com.
Мультипроцессорность
- это эмуляция двух МК в устройстве, у
каждого своя прошивка и они работают не зависимо - это очень мощно если
правильно этим воспользоваться!
Юзер дефайн компонентс - в общем если
вам нужен какой либо электронный компонент отсутствующий в списке VMLAB,
вы можете создать его сами! в соответствии с ДШ или по вашим
потребностям - даже не существующий в природе!
Я
сделал упражнение - задачу 3 в которой очень
подробно рассмотрел симуляцию программы на VMLAB с картинками.
|
В поставку VMLAB включено множество примеров программ и прошивок для немедленной симуляции - эмуляции устройства с МК. Примеры находятся в папках: Tutorial и AVR_demo Запустите их и освойтесь, поиграйте с симулятором на досуге ... |
||
Есть пример работы VMLAB с CodeVisionAVR.
откройте файл проекта C:\VMLAB\AVR_demo\codevisi.prj
и по-симулируйте ! При
симуляции вы увидите
движение по
исходному тексту программы на Си, и можете расставлять точки останова
программы, наблюдать за изменениями значений в регистрах МК, посмотреть
осциллограммы сигналов на ножках МК и многое другое ...
Уже упоминал: пример работы VMLAB с WinAVR вы устанавливаете winavr в папку по умолчанию и больше ни когда не заглядываете в неё Вся работа от написания кода на Си до отладки выполняется из VMLAB - это очень удобно. C:\VMLAB\WinAVRdemo\файлы.prj -захотите попробуете ...
|
Совет ! Скачайте мою заготовку (Шаблон, "РЫБА" - всего 6 Кб) для быстрого старта в совместном использовании компилятора CodeVisionAVR и симулятора VMLAB с МК ATmega16 Распакуйте файлы
из архива в папку:
С:\VMLAB\WORK В общем качайте ! - это нужно ВАМ ! |
||
повторю
:
На софт-эмуляторе симуляторе VMLAB
мы будем проверять работу программы для разрабатываемого устройства.
Файл-прошивку для МК
(расширение .hex)
созданный в компиляторе будем прогонять в симуляторе МК с внешними
компонентами и смотреть что работает, что нет, и как работает...
При необходимости будем корректировать исходный текст программы на Си,
опять компилировать, и так по кругу до достижения правильной
работы устройства. Этот процесс называется -
отладка программы или дебагинн - очистка от всякой нечисти - "тараканов"
и "жучков"...
Скачав рекомендованные
программы - установите
их на диск С:\ в каталоги :
CVAVR ICCv7avr VMLAB
тогда рабочие файлы будут
находятся по тем же адресам что и в задачах-примерах. Значит будет
проще помочь, ответить на ваши вопросы.
Сделайте архивы установленных программ целиком
- это поможет восстановить, случайно испорченные при опробовании программ,
файлы примеров и помощи, без переИнсталляции.
|
Хелпы во всех рекомендуемых программах качественные и подробные! НЕ забывайте их читать! |
||
Не обязательный для курса
но ВЕЛИКОЛЕПНЫЙ
Пакет для разработки
электронных устройств от схемы до печатной платы
PROTEUS
Действительно супер !
Во первых
PROTEUS
может симулировать несколько МК
в одном устройстве, причем не только AVR но и PIC и Motorola и 8051 и даже
ARM7 вперемешку !
Во вторых
в поставку PROTEUS входит очень много моделей компонентов.
В третьих вы можете
симулировать любые электронные устройства и не содержащие МК и очень
сложные и электро-механические системы - это очень полезно, Вам
нужно проверить какую то идею или вариант реализации чего либо ? Вы
можете не паять, не искать детали, запоминающий осциллограф и другие
измерительные приборы, а Просто "соберите" вашу схему в PROTEUS и
посмотрите как она будет работать, каковы будут выходные
параметры. PROTEUS - симулирует очень реалистично ! И главное
наглядно видна работа устройства, напряжения и токи в нем.
В четвертых PROTEUS
- по сути справочник электронных компонентов
Когда вы просматриваете библиотеки для добавления компонента на схему -
вам сразу показываются его основные свойства и корпус компонента -
какова его площадка на плате. Просто класс ! Для поиска компонента вам
достаточно ввести в окно несколько символов из его марки или описания и
затем выбрать из предложенных категорий.в
пакет включены отличные примеры работы
в PROTEUS примерно
60 устройств готовых к симуляции.
Это :
- дата логер на жесткий диск (есть модель IDE HDD ! )
- можно поиграть в шахматы с ATmega128 !!! (есть модель "точскрина" )
- есть пример работы с графическим LCD дисплеем
- управление шаговым двигателем
- управление электродвигателем
- управление servo
- радиочастотные схемы, трансформаторы, линии передачи.
- конечно кнопки, индикаторы, светодиоды, связь с ПК, разные датчики, память
- конечно есть виртуальные приборы.
- отладка интерфейсов UART i2c TWI SPI
... Короче все примеры "весят" 16 Мб в распакованном виде !
Вы можете скачать DEMO версию (около 26 Мб) - она полностью рабочая ! Только одно ограничение - не позволяет вам сохранить результат вашей работы. Читайте Краткий Курс Самоучитель PROTEUS
|
А если нет модели нужного вам компонента ? Вот что я придумал -
Если вы не
находите модели нужного вам компонента, то вы можете изобразить
ее с помощью еще одного МК и возможно некоторых существующих
компонентов. Дело
в том что симуляторы не против не реально высокой частоты
работы симулируемого МК - я пробовал 500 МГц в PROTEUS и все
работает. Думаю вычислительная мощность МК в таком режиме
позволит вам изобразить что угодно.
Преимущество моего
метода - Вам
не нужно изучать методику и иметь инструментарий для создания
моделей для VMLAB или PROTEUS
стандартным способом. Вы лишь лишний раз поупражняетесь в
программировании МК с которым работаете.
Кроме того теперь
PROTEUS не работает с моделями созданными без специально
полученного кода для создания модели ! А по моему
методу вы сможете делать модели и при желании продавать их не
имея такой лицензии и законно! |
||
Вам необходимы
две программы - CVAVR и VMLAB для усвоения дальнейшего материала
курса.
часть 1
(Чуток, но и этого будет достаточно ...)
Я расскажу об устройстве и структуре
программы на языке Си
и опишу
используемые в МК
конструкции языка.
По умолчанию компилятор CVAVR. В других компиляторах могут быть незначительные отклонения, нюансы не связанные с языком Си а обусловленные стараниями и предпочтениями разработчиков этих компиляторов.
Я покажу вам, что Си это ДЕЙСТВИТЕЛЬНО ОЧЕНЬ ПРОСТО, если у вас реальные для начинающего цели!
|
Кстати БЭЙСИК тоже не плох ! Вот скачайте архив (5 Кб всего) с перечнем АпНоутов - великолепных и интересных устройств в которых программы для МК AVR написаны на языке Бэйсик. Скачать BASCOM-AVR-1.11.8.3 full - полная версия можно там |
||
Минимальная программа на Си может быть такой:
|
main(){} |
||
Эта программа не делает ни чего полезного - но это уже программа и она показывает что в программе на языке Си - должна быть главная функция main - обязательно ! Реальные программы на Си конечно больше.
Скачайте и Распечатайте - Памятка Си для МК на ОДНОЙ странице !
Рассказывая про МК я говорил вам что, задача программы МК: читать числа из регистров МК, делать что-то с ними и записывать числа в регистры. Только так программа может общаться с МК. Как это делать на языке Си
Регистры
МК в программе на Си имеют названия как и
в ДШ и так как
числа в большинстве из них
можно менять - для программы регистры
являются по сути переменными.
1) Чтобы поместить число в переменную (в регистр) в Си есть оператор присваивания - это знак = ("равно" ) . В Си этот знак не означает равенство , = в Си означает вычислить результат того что справа от оператора присваивания и поместить этот результат в переменную находящуюся левее оператора присваивания.
|
PORTB = PINB
+
34;/*
Эта строчка на Си означает |
||
|
ПЕРЕМЕННАЯ = PINC;
/*
Эта строчка на Си означает |
||
Чтобы в Си взять (прочитать) число из регистра или значение переменной нужно написать его название НЕ непосредственно с лева от оператора присваивания ! во загогулина понимашшшь... Ж)
примеры :
1) Строка где переменная стоит слева от = но через знак &
PORTB & = 0x23;
на Си означает - прочитать содержимое переменной PORTB, затем выполнить "поразрядное (побитное) логическое И" между прочитанным значением и числом 0x23 и поместить (записать, присвоить) результат в переменную PORTB
2) Строка где переменная стоит непосредственно слева от =
PORTB = 0x23;
на Си
означает - не читая содержимое
переменной PORTB
присвоить ей значение 0x23
|
Вместо
&
"И" (AND - только 1 и 1 дают 1) могут
быть и другие побитные логические
операции:
^ "Исключающее ИЛИ" (XOR изменить бит напротив "1") ~ "инвертирование битов" (INV изменить биты регистра) и арифметические операции: + - * / % |
||
С
оператором присваивания
используются вот такие сокращения:
|
ДЛИННАЯ ЗАПИСЬ |
|
СМЫСЛ |
|
СОКРАЩАЕТСЯ ДО |
|
x = x + 1; |
|
добавить 1 |
|
x++; или ++x; |
|
x = x - 1; |
|
вычесть 1 |
|
x--; или --x; |
|
x = x + y; |
|
прибавить y |
|
x += y; |
|
x = x - y; |
вычесть y |
x -= y; |
||
|
x = x * y; |
|
умножить на y |
|
x *= y; |
|
x = x / y; |
поделить на y |
x /= y; |
||
|
x = x % y; |
остаток от деления |
|
x %= y; |
|
|
x--; |
вычесть 1 |
x -= 1; |
||
|
x++; |
|
добавить 1 |
|
x += 1; |
примеры :
|
10010 |
1001111
// "ИЛИ"
- только 0 и 0 дают 0 1011111
//
это результат |
||
|
10010 & 1001111
//
"И" - только 1 и 1 дают 1 10 // это результат // только биты_2 в обоих числах были единицы |
||
|
10010 ^
1001111
1011101 // это результат /*
изменились биты во втором числе
напротив |
||
|
~ 1001111
/*
инвертировать биты 110000 // это результат |
||
Запомните ! Результатом поразрядных (побитных) логических операций : & | ^ ~ является число, которое может быть интерпретировано компилятором как "истина" если оно не ноль и "ложно" если число ноль.
|
Числа В компиляторе можно записывать в виде указанном в его Help'е ! Раздел - константы - Constants. например - Целые числа могут быть записаны :
Числа с плавающей точкой имеют в
записи эту точку и какое либо число
после этой точки, так: 61.234
или так:
73.0 и так:
.786 и могут
иметь в конце F
вот так: 61.234F Цвета я применил УСЛОВНО для лучшей читаемости! |
||
|
D3h равно 0xD3 равно 0b1101 0011 равно 211
|
|||||||||
|
шестнадцатеричное число 0xD3 |
|||||||||
|
0 |
x |
D |
3 |
||||||
|
двоичное представление - число 0b1101 0011 |
|||||||||
|
0 |
b |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
|
номера бита |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
|
два в степени равной номеру бита |
|||||||||
|
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
||
|
число 211
в десятичном виде |
|||||||||
|
Сложите |
+128 |
+64 |
+16 |
+2 |
+1 |
||||
Четыре
бита это 1 нибл или 1 символ в 16-ричной
системе или десятичное число от 0 до 15.
"В уме" удобно оперировать ниблами:
|
двоичный |
десятичный |
16-ричный |
|
0000 |
0 |
|
|
0001 |
1 |
|
|
0010 |
2 |
|
|
0011 |
3 |
|
|
0100 |
4 |
|
|
0101 |
5 |
|
|
0110 |
6 |
|
|
0111 |
7 |
|
|
1000 |
8 |
|
|
1001 |
9 |
|
|
1010 |
10 |
A |
|
1011 |
11 |
B |
|
1100 |
12 |
C |
|
1101 |
13 |
D |
|
1110 |
14 |
E |
|
1111 |
15 |
F |
Для перевода чисел
из одного вида в другой можно использовать калькулятор
Windows в инженерном виде.
Есть в Си операции которые изменяют значение переменной и без оператора присваивания :
|
PORTA++;
/*
Эта строчка на Си означает говорят: Инкрементировать регистр PORTA */ PORTC--;
/* Эта
строчка на Си означает Декрементировать - вычесть 1 из значения регистра PORTC */ |
||
Инкремент
и декремент удобно использовать для
изменения значения различных
переменных счетчиков.
Важно помнить
что они имеют очень низкий приоритет -
поэтому чтобы быть уверенными в порядке
выполнения желательно писать
их
отдельной строчкой программы !
|
Обратите внимание ! В конце выражения или конструкции в программе на Си ставят точку с запятой. Длинные выражения можно писать в несколько строк.
/* ЗЕЛЕНЫМ я
пишу комментарий к программе
// или в одну после двух черточек Компилятор игнорирует все что написано в комментариях. Вы не компилятор , не игнорируйте, пишите и читайте ! |
||
Когда
инкремент или декремент используется в
выражении то важно где стоят два знака + или
- перед переменной или после переменной :
|
a=4; a = b++;
/*
Эта строчка на Си означает
Взять
значение переменной b присвоить
его переменно a затем добавить 1
к переменной b
a=4; a = ++b; /* Эта строчка на Си означает Взять значение переменной b затем добавить к нему 1 и сохранить результат в b и этот же результат присвоить a. Теперь a будет содержать число 8 и b будет содержать число 8 */ |
||
2) Арифметические операции в Си
|
x + y //
сложение
Если
числа целые результат - целое число
с отброшенной дробной частью - не
округленное ! т.е.
если в результате деления на
калькуляторе получается 6.23411 или 6.94
то результат будет просто целое
число 6 -
запомните ! Если
числа с плавающей точкой, то есть float
или double и записываются с точкой и
числом после точки, то и
результат будет число с плавающей
точкой */ x
% y
// вычислить остаток от деления нацело // примеры: |
||
3) Операторы сравнения (или отношения): используются для сравнения переменных, чисел (констант) и выражений.
|
x < y
// X меньше Y "истина" это "1" (точнее "не ноль") "ложно" это "0" Значения хранимые в переменных (в регистрах) х и у НЕ изменяются. Берутся (считываются) значения хранящиеся (или содержащиеся) в переменных и сравниваются */ ! /* "НЕ" - логическое отрицание */ |
||
4) Логические операции :
|
|| //
"ИЛИ" - только "ложь" и "ложь"
! // "НЕ" - логическое отрицание /* Правило - в Си считается: "Ложь" (False) только ноль. "Истина"(True)- не ноль. или так: (!0) */ !(истина) // дает "ложь" !(ложь) // дает "истина" |
||
В
результате логической операции вы
получаете
НЕ ЧИСЛО, а логическое значение "истина"
или "ложь"
Для логических операций && и || берутся результаты выражений слева и справа от знака операции преобразованные в "истину" или "ложь" и определяется логический результат операции. Компилятор, для определенности наверно, результат "истина" превращает в 1 а не в любое отличное от 0 число.
|
Совет:
Используйте
скобки |
||
Логические операции могут объединять несколько проверяемых условий.
Например:
if((выражение1)&&((выражение2)||(выражение3)))
{/*
Код
программы здесь будет выполняться если:
Выражение1
"Истина" (значит не ноль)
и
хотя бы одно из выражений 2 и 3 тоже "Истина"
(значит не ноль).
};
Подробнее о логических операциях обязательно прочитайте по линку в низу 2-й части этой страницы !
Самое интересное - Ходовые конструкции на Си
5) if(){}else{}; идеальная конструкция если вам нужно выполнить какую то часть программы при наличии каких либо условий :
|
if (выражение) {
/* делать этот
код если выражение "истина" - т.е.
результат его вычисления не ноль */ |
||
} else { это не обязательный элемент конструкции :
|
if (выражение) {
/* делать этот
код если выражение "истина" - т.е.
результат его вычисления не ноль */ |
||
6) while(){}; условный цикл
- используйте если вам
нужно выполнять
какой то код программы пока выполняется
(существует,
справедливо, не ноль) некоторое условие :
|
while (выражение) { /* делать этот код если выражение "истина" - т.е. результат его вычисления не ноль. Пока выполняется этот код выражение не проверяется на истинность ! После
выполнения кода происходит
переход к строке while снова проверять
истинность выражения */ |
||
Цикл while имеет вариант do - while при котором код в { } выполняется по меньшей мере один раз не зависимо от истинности условия в скобках :
|
do {
/*
сделать этот код один раз |
||
7) for(;;){}; - этот цикл позволяет выполнить часть программы нужное число раз:
|
char i; /* объявление переменной для for это обычная переменная и значит может иметь любое допустимое имя по вашему желанию */ for (i=5;i<20;i+=4) {
/*
код цикла for i=5 - это начальное выражение Число 5 просто для примера, может быть таким, как позволяет объявление переменной i, в нашем случае от 0 до 255 i<20 - контрольное выражение Может быть с разными операторами отношения, важно лишь чтобы по ходу цикла оно становилось когда-то "ложью" - иначе цикл "зациклится" т.е. ни когда не кончится. i+=4 - счетчик Обычно это i++ т.е.к переменной добавляется 1 каждый "прогон" цикла. Но опять же может быть таким какое вам требуется, важно лишь достижение когда либо условия абзацем выше ! Иначе цикл станет бесконечным. Код цикла for будет первый раз выполнен для i=5, затем по выражению i+=4, i станет 9 теперь будет проверено контрольное выражение i<20 и так как 9<20 код цикла for будет выполнен еще раз.
Так
будет происходить до тех пор пока
контрольное выражение "истино" |
||
Начальным условием - может быть любое допустимое в Си выражение результатом которого является целое число.
Контрольное выражение - определяет до каких пор будет выполнятся цикл.
Счетчик - показывает как изменяется начальное выражение перед каждом новом выполнении цикла .
циклы for(;;) и while() часто используют вот так:
|
while(1); for (;;); /* Так написанные эти циклы означают : МК выполнять эту строчку пока есть питание, нет сброса и нет прерывания. Когда возникает прерывание, программа переходит на обработчик прерывания и (если в обработчике нет перехода в другое место программы)по завершении кода обработчика опять возвращается в такой цикл. */ |
||
8)
switch(){};
- оператор множественного выбора,
позволяет вам сделать выбор из
нескольких вариантов.
|
switch
(выражение) { на этом
работа оператора switch закончится
*/ case -32: на этом
работа оператора switch закончится */ case 'G': на этом
работа оператора switch закончится */ на этом
работа оператора switch закончится */ /* switch закончен - выполняется дальнейший код программы */ |
||
case - может быть столько сколько вам нужно, чтобы программа работала быстрее старайтесь наиболее вероятные варианты располагать выше!
default - не обязателен.
break; - лучше писать, иначе найдя нужный вариант программа будет проверять и следующие условия case - напрасно тратя время.
Скачайте и Распечатайте Таблицу символов ASCII на ОДНОЙ странице !
9) goto - оператор безусловного (немедленного) перехода.
|
mesto_5: /* сюда мы попадем после выполнения строки программы goto mesto_5 */ goto mesto_1; /* перейти в то место программы где в начале строки написано mesto_1: */ goto mesto_5; /* перейти в то место программы где в начале строки написано mesto_5: */ mesto_1: /* сюда мы попадем после выполнения строки программы goto mesto_1 */ |
||
goto - существует наверно во всех языках и в ассемблере в том числе. Используйте его с осторожностью! Думайте к чему может привести выполнение функций или конструкций вашей программы не до конца.
Например: Если вы покинете функцию - обработчик прерывания по goto не завершив ее, то не произойдет автоматического включения прерываний глобально - т.е. не установится бит I в регистре SREG, Этот бит устанавливается автоматически после полного выполнения функции обработки прерывания и "естественного" выхода из неё.
Ну вот - ПОЧТИ всё что нужно нам из Си ! Как использовать описанное выше вы можете посмотреть в примерах к компилятору ! Примеры в папке :
C:\CVAVR\EXAMPLES
Открывайте файлы .с и разбирайте текст программ - что делает каждая строчка! Это великолепный способ само- обучения программированию !
Программа на языке Си это текстовый файл с расширением .c
Текст программы называют исходным или "исходником" или "сурцом" от анг. source code - это вам ключевые слова для поиска !
"Исходник" на Си имеет определенную структуру :
1) заголовок
2) включение необходимых внешних файлов
3) ваши определения для удобства работы
4) объявление глобальных переменных
Глобальные переменные
- объявляются
вне какой либо функции.
т.е. не после фигурной скобки {
- доступны в любом месте программы - значит можно читать их значения и присваивать им значения там где требуется.
5) описание функций - обработчиков прерываний
6) описание других функций используемых в программе
7) функция main - это единственный обязательный пункт !
|
Это не жесткий порядок а ориентировочный ! Иногда п.6 это прототипы функций, а сами функции описываются полностью после п.7 Прототип функции - показывает образец того как применять функцию в программе, какие значения в нее передаются и если она возвращает какое-то значение то прототип указывает тип возвращаемых данных. Прототип не имеет скобок { } а после скобок ( ) ставится ; Функция - имеет { "тело" } в фигурных скобках. Тело это код на Си определяющий то что делает функция. ; после функции не ставится. |
||
Программа
на Си начинает работу с функции main(),
по необходимости из main()вызываются
другие функции программы,
по завершении работы функции программа
возвращается в main()
в то
место от куда функция была вызвана.
main(){
... какой то код программы ...
вызов функции_1; //программа перейдет в функцию_1
строка
программы; //
будет выполнятся после
//
возврата из функции_1
... какой то код программы ...
}
функции могут вызываться не только из main() но и из других функций.
с описанной выше структурой я буду писать на голубом фоне.
По мере надобности я буду разрывать голубой фон обычным текстом, затем голубой фон и программа будет продолжаться.
|
/* п.1 заголовок программы Он оформляется как комментарий, и обычно содержит информацию - о
названии, назначении, версии и
авторе программы // комент. после двух косых черт пишут в одну строку!
//п.2
включение внешних файлов Посмотрите его содержание CVAVR\inc\mega16.h */
Теперь чтобы сделать паузу вам нужно лишь написать : delay_ms(x);
// сделать паузу
x
милиСек x - число от 0 до 65535 (тип unsigned int) */
//п.3 определения пользователя // AD7896 control signals PORTB bit allocation Таким образом вместо того что бы помнить что вывод занятости AD7896 подключен у вас к ножке PB0 вы можете проверять значение осмысленного понятия ADC_BUSY - "АЦП занят" а вместо управления абстрактной ножкой PB1 (через PORTB.1) вы можете управлять "НьюКонвешнСтат" - NCONVST - "стартовать новое АЦ преобразование" #define
- Это удобно !
|
||
Определения
(соответствие
номера бита в регистре его названию по
ДШ) отдельных битов есть в
"хидерах" .h в ICC,
IAR и других компиляторах, но их нет в
хидерах CodeVisionAVR Поэтому я
сделал для вас
файл
- заголовок m8_128.h скачайте его
и добавьте в программу вот так:
#include <mega16.h>
//сперва обычный хидер
#include <m8_128.h>
//мой хидер для битов
Теперь вы можете использовать примеры на Си из ДШ на соответствующий МК ! Мой файл m8 128.h содержит определения битов для микроконтроллеров ATmega8 ATmega16 ATmega32 ATmega64 ATmega128
|
Мастер начального кода программы в компиляторе ICC умеет по вашему желанию автоматически делать #define для ножек МК !Подробней про это и с картинкой смотри в соответствующей задаче курса. |
||
#define - может содержать и некоторые переменные, вместо которых в тексте программы могут быть подставлены и числа и слова.
Например:
#define invbit(p,n) (p=p^bit(n))
Здесь переменные величины это 'p' и 'n'. Кроме того в самой правой части эти переменные величины могут быть связаны и арифметическими операциями и таких переменных может быть много.
Объявление переменных
Перед использованием переменной в программе на Си её необходимо объявить - т.е. указать компилятору какой тип данных она может хранить и как она называется.Наиболее подробно об этом по ссылке: 1.2. ТИПЫ ДАННЫХ И ИХ ОБ ЯВЛЕНИЕ. Ниже сжато - самое главное:
Формат объявления переменной таков:
[<storage modifier>] <type definition> <identifier>;
|
[<storage modifier>]- необязательный элемент, он нужен только в некоторых случаях и может быть:
extern
- если переменная объявляется во
внешнем файле - например в хидере
delay.h
приведенном выше. static
- если переменная
локальная т.е. объявлена в какой
либо функции и должна сохранять свое значение до
следующего вызова этой функции. flash и eeprom - используются с указателями. |
||
Глобальные переменные объявляются до появления в тексте программы какой либо функции. Глоабльные переменные доступны в любой функции программы.
Локальные переменные объявляются в самом начале функций - т.е. сразу после фигурной скобки "{". Локальные переменные доступны только в той функции где они объявлены! В разных функциях могут быть объявлены локальные переменные с одинаковыми именами - я не советую вам так делать. Советую не использовать ЛОКАЛЬНЫЕ переменные в главной функции main.
<type definition> - тип данных которые может хранить переменная.
наиболе часто используемые типы данных :
unsigned char - хранит числа от 0 до 255 (байт)
unsigned int - хранит числа от 0 до 65535 (слово == 2 байта)
unsigned long int - хранит от 0 до 4294967295 (двойное слово == 4 байта)
Подробнее все типы данных посмотрите в Help CVAVR\bin\CVAVR.HLP Раздел "Data Types"
|
Вместо unsigned char - можно писать писать просто char, так как компилятор по умолчанию считает char без знаковым байтом. А если вам нужен знаковый байт то объявляйте его так : signed char imya_peremennoi; |
||
<identifier>
- имя переменной - некоторый набор
символов по вашему желанию, но не образующий
зарезервированные слова языка Си.
Выше был уже пример идентификатора - имени переменной:
imya_peremennoi
|
Желательно давать осмысленные имена переменным и функциям - напоминающие вам об их назначении. принято использовать маленькие буквы, а для отличия имен переменных от названия функций - имена переменных можно например начинать с буквы, а названия функций (кроме main конечно) с двух символов подчеркивания. Например
так : |
||
Внимание! Глобальные переменные, а также локальные с модификатором static - при старте и рестарте программы равны 0 если вы не присвоили им (например оператором =) иное значение при их объявлении или по ходу программы.Подробные примеры объявления переменных посмотрите пожалуйста в разделе Variables в "Хелп" компилятора. Вот несколько примеров объявления переменных :
unsigned char my_peremen = 34;
unsigned int big_peremen = 34034;
Это объявлены две переменные и им присвоены значения.
Первая my_peremen - символьного типа - это 1 байт, она может хранить число от 0 до 255. В данном случае в ней хранится число 34.
Вторая big_peremen - целого типа, два байта, в ней может хранится число от 0 до 65535 , а в примере в неё поместили десятичное число 34034.
Пример массива
содержащего
3 числа или элемента массива.
char mas[3]={11,22,33};
Нумерация элементов начинается с 0. Т.е. элементы данного массива называются
mas[0], mas[1], mas[2]
и в них хранятся десятичные числа 11, 22 и 33.
Где то в программе вы можете написать:
mas[1] = 210;
Теперь в mas[1] будет хранится число 210
- массивы могут быть
многомерными,
- можно не присваивать значений элементам массива при объявлении
НО только при объявлении вы можете присвоить значения всем элементам массива сразу ! Потом это можно будет сделать только индивидуально для каждого элемента.
Строковая переменная
или массив содержащий строку символов.
char stroka[6]="Hello";
Символов (букв) между кавычками 5 , а я указал размер строки 6 !
Дело в том, что строки символов
должны заканчиваться десятичным числом 0.
Не путайте его с символом '0'
которому соответствует десятичное число 48 по
таблице ASCII
- которая устанавливает каждому числу определенный символ.
Например :
Элемент строки stroka[1]
содержит число 101
которому по
таблице ASCII
соответствует символ 'e'
Элемент stroka[4]
содержит число 111
которому соответствует символ 'o'
Элемент stroka[5]
содержит число 0
которому соответствует
символ
'NUL' его
еще обозначают вот так
'\0'
Строковая переменная может быть "распечатана" или выведена в USART MK вот так:
printf("%s\n",
stroka);
|
Вы можете преобразовать строковую переменную в число ! Если исходная строка символов такая : char stroka[]="3654694"; то вот так: perem_1 = atoi(stroka); мы поместим в переменную perem_1 (которую должны были ранее в программе объявить как "беззнаковую целую") число 36546. Это число влезет в переменную perem_1 которая может хранить числа от 0 до 65535.А вот 9 и 4 уже не поместятся.Для бОльших чисел есть функция - atol() Чтобы использования эти функции необходимо включить в начале программы заголовочный файл : #include <stdlib.h> Для преобразования числа в строку есть itoa() и ltoa()
|
||
|
|
Советую вам скачать заголовочный файл m8 128.h Он содержит названия битов МК ATmega8 -16 -32 -64 -128 и сокращенные названия типов данных как в компиляторе IAR. вот отрывок из него:
#define u8 unsigned char // 0 to 255
#define s8 signed char // -128 to 127
#define u16 unsigned int // 0 to 65535
#define s16 signed int // -32768 to 32767
#define u32 unsigned long int // 0 to 4294967295
#define s32 signed long int // -2147483648 to 2147483647
#define f32 float // ±1.175e-38 to ±3.402e38
#define d32 double // ±1.175e-38 to ±3.402e38
После включения моего
"хидера" в текст вашей
программы вы сможете писать вместо
длинного
unsigned long int <имя 32 битной переменной>
коротко :
u32 <имя 32 битной переменной>
u - беззнаковая - значит не отрицательная
s - значит переменная со знаком
32 - количество бит в
переменной
|
/*
п.5
описание функций - обработчиков прерываний Подробно
о прерываниях в AVR
читайте на
стр. 3 курса ! мы
будем использовать в ЭТОЙ программе - только одно прерывание и значит одну функцию обработчик
прерывания. Программа
будет переходить на неё при
возникновении прерывания :
/* сделаем
паузу 127 мСек чтобы в реальном
устройстве можно было увидеть переключение
светодиодов */ //
начать
новое АЦ преобразование |
||
Функция обработчик
прерывания может быть названа вами произвольно - как и любая функция
кроме main.
Здесь
она названа :
adc_isr
При каком прерывании ее вызывать - компилятор узнает из строчки :
interrupt[ADC_INT]
по первому зарезервированному слову - interrupt - он узнаёт, что речь идет об обработчике прерывания, а номер вектора прерывания (адрес куда физически, внутри МК перескочит программа при возникновении прерывания) будет подставлен вместо ADC_INT препроцессором компилятора перед компиляцией - этот номер указан в подключенном нами ранее заголовочном файле ("хидере") описания "железа" МК - mega16.h - это число сопоставленное слову ADC_INT.
Очень информативна и тем ценна для обучающегося следующая строка программы:
PORTB = (unsigned char) ~(ADCW>>2);
Давайте проанализируем как она работает.
=
оператор присваивания. Он означает присвоить значение
выражения
справа от оператора
присваивания той переменной что указана
слева от него.
Значит нужно
вычислить выражение справа и поместить
его в переменную PORTB.
Вычислим что справа от оператора присваивания.
ADCW - это переменная слово (двухбайтовая величина - так она объявлена в файле mega16.h) в котором CodeVisionAVR сохраняет 10-битный результат АЦП - а именно в битах9_0 (биты с 9-го по 0-й) т.е. результат выровнен обычно - вправо.
Но у нас, в VMLAB только 8 светодиодов и нужно отобразить 8 старших бит результата - т.е. биты_9_2 - для этого мы сдвигаем все биты слова ADCW вправо на 2 позиции
ADCW
>> 2 /*
биты
1 и 0 вылетают вправо из числа в небытие,
бит_9 перемещается в позицию бит_7,
бит_8 в позицию бит_6 и так далее до бит_2
становится бит_0
*/
Теперь
старшие 8 бит результата АЦП встали в биты7_0
младшего байта (LowByte - LB) слова ADCW
|
>> n |
означает сдвинуть все биты числа вправо на n позиций это равносильно делению на 2 в сепени n |
||
|
|
|
||
|
<< n |
означает сдвинуть все биты числа влево на n позиций это равносильно умножению на 2 в сепени n |
||
|
Сдвиг используется очень часто ! |
|||
|
|
|||
Светодиоды подключены так как написано выше - т.е. подключены правильно !
Загораются (показывая "1") при "0" на соответствующем выводе МК - значит нам нужно выводить в PORTB число в котором "1" заменены "0" и наоборот - это делает как я рассказал выше :
~ операция побитного инвертирования
Значит результатом этого выражения
~(ADCW>>2)
будут инвертированные 8 старших бит результата АЦП находящиеся в младшем (правом - LB) байте двух байтового слова ADCW
Выше я уже говорил
что : в Си в переменную можно помещать только тот тип данных который она может хранить !
Так как PORTB
это байт, а ADCW
- это два байта, то прежде чем выполнить
оператор присваивания (это знак =
) нужно
преобразовать слово (слово - word -
значит два байта) ADCW
в без знаковый байт.
|
Преобразование типов данных - делают так :
перед тем что надо преобразовать записывают
в скобках ( ) |
||
|
|
Пишем ...
(unsigned char) ~(ADCW>>2)
Результат этой строки - один байт и мы можем поместить его в PORTB
Если в регистре DDRB все биты равны "1" - т.е. все ножки порта_B выходы, мы безусловно увидим старшие 8 бит результата АЦП горящими светодиодами.
Вам должна быть абсолютно понятна разобранная строка:
PORTB = (unsigned char) ~(ADCW>>2);
Если это не так то повторите разбор, и почитайте рекомендованное ниже по Си.
разберем еще одну строчку :
ADCSRA|=0x40;
обратите
внимание на необходимость ставить в
конце выражений точку с запятой - не
забывайте ! Эта строка
означает следующее:
Двигаемся слева на право :
- берем значение переменной ADCSRA (это регистр МК - значит программа прочитает его, возьмет число из него)
- выполняем с этим числом операцию обозначаемую вертикальной черточкой | ( это поразрядная операция ИЛИ - только "0" и "0" дают "0" ) с числом 0x40
- присвоим или поместим результат поразрядного ИЛИ обратно в переменную ADCSRA - т.е. запишем результат в регистр ADCSRA
0x40 это в двоичном виде: 0100 0000
так как в результате поразрядного ИЛИ только два "0" дают "0" биты в ADCSRA напротив нулей не изменятся, а вот бит_6 в ADCSRA оказывается напротив "1" и теперь он станет "1" не зависимо от того каким он был до этого !
т.е. смысл рассматриваемой строки программы
ADCSRA|=0x40;
"установить" (т.е. сделать "1") бит_6 в регистре ADCSRA
|
Число
справа от составных операторов
|= &=
^= обычно
называют маской, |
||
|
|
Для обнуления нужных бит используют
обозначаемое знаком & поразрядное логическое И - только
"1" и "1" дает "1"
PEREM &=(~0x04); // обнулить бит_2 в переменной PEREM
Скобки здесь я добавил для улучшения читаемости кода.
Самоконтроль - важно:
а) обязательно разберитесь почему обнуляется бит_2
б) Как в двоичном виде выглядит результат (~0x04)
|
/* п.6 функции используемые в программе */ // их может быть столько сколько вам нужно.
// у нас будет одна, кроме main и /* ================================= Удобно
над функцией сделать заголовок /* void - означает пусто. Перед названием функции - void - означает что функция не возвращает ни какого значения. А в скобках после названия означает что при вызове в функцию не передаются ни какие значения. */
//
инициализация Port_B
/* настройка АЦП - производится записью определенного числа в регистр "ADC Control and Status Register A" – ADCSRA посмотрите его описание в ДШ МК мега16. Нам нужно: - Включить модуль АЦП - Установить допустимую частоту тактирования АЦП при частоте кварца 3.69 МГц - мы выберем коэф. деления 64 - это даст частоту такта для процессов в АЦП 57.656 КГц - Включить прерывание по завершению АЦ преобразования. По ДШ
для этого нужно записать в регистр ADCSRA
// ADC initialization w Oscillator=3.69MHz
/*
Теперь выбираем вход АЦП ADC0 (ножка PA0)
и внешнее опорное напряжение (это
напряжение код АЦП которого будет 1023)
с ножки AREF
Вы
наверно поняли что индивидуально мы
разрешили |
||
Внимание ! так делаются вставки ассемблерных инструкций:
#asm("инструкция на ассемблере")
Обратите внимание - точки с запятой НЕТ ! Такие вставки принято иногда делать НО они не являются необходимыми, На Си можно управлять ВСЕМИ программно изменяемыми битами в регистрах МК !
|
Напоминаю ... Все регистры МК перечислены в конце ДШ с указанием номеров страниц с подробным описанием регистра и его битов. |
||
|
|
Но почему-то часто используются такие строки:
#asm("sei") // Разрешить ГЛОБАЛЬНО все прерывания
#asm("cli") // Запретить ГЛОБАЛЬНО все прерывания
#asm("nop") // Пауза в 1 такт процессора
#asm("wdr") // Сбросить сторожевой таймер
|
// все функция закончена |
||
Далее...
|
/*
/* ================================= Си
программа начинает выполнятся с нее! void main(void){ __init_mk();/*Вызываем функцию инициализации,
настроийки аппаратуры МК. Выполнив ее программа вернется сюда
и будет выполнять
// запускаем первое АЦП
// бесконечный цикл в ожидании
прерываний |
||
Теперь программа будет работать так :
По завершении АЦП будет возникать прерывание и программа будет перескакивать в функцию обработчик прерывания adc_isr(), при этом будут автоматически запрещены все прерывания ГЛОБАЛЬНО !В конце adc_isr() запускается новое АЦ преобразование и при выходе из обработчика прерывания снова разрешаются глобально прерывания, и программа возвращается опять в бесконечный цикл while(1) .Такая чехарда будет продолжаться пока есть питание МК и не будет сброса. Светодиоды будут высвечивать 8-ми битный код АЦП напряжения на ножке PA0
Еще щепотка Си :
Пример: делать что-то пока на ножке PBn есть "1"
while(PINB &
(1 << n)){
что-то
/* что-то будет выполнятся
снова и снова, пока
проверка условия в скобках после while
будет давать "истину" - значит пока на ножке PBn
есть логическая
единица */
};
примечание
- в CVAVR можно написать проще
while(PINB.n){
Пример: выполнить что-то если на ножке PCn есть "0"
if((~PINC)&(1 <<
n)){
что-то
/* что-то
начнет выполняться если
на ножке PCn
был "0" */
};
примечание
- в CVAVR можно написать проще
while(!(PINB.n)){
Помните !
Выполнение чего-то
может быть прервано
прерыванием.
После завершения
обработки прерывания выполнение чего-то
продолжится.
примечание -
Условие :
if((~PINC)&(1 << n)) {
можно записать и вот так :
if(!(PINC & (1 << n))) {
|
К битам регистров с адресами от 0 до 31 в компиляторе CodeVisionAVR можно обратится (и читать и записывать) проще. Вот так: REGISTR.BIT |
||
|
|
Пример: PINB.2 или PORTA.5
Пример:
if(!PINB.2){
этот код
/*
Если на ножке PB2 низкий
логический
уровень - то выполнить
этот код */
};
Пример:
PORTA.3 = 1;
/*
Сделать бит 3 в регистре
PORTA единицей -
говорят: "установить бит"
по англ. "set bit"
*/
|
Битовые операции подробно описаны в задаче 1 и конечно в help компиляторов ! |
||
|
|
Всё программа на Си написана. Вам должно быть все ясно и абсолютно понятно. Если это не так то перечитайте, подумайте, повторите разбор, почитайте рекомендованное ниже по Си.
Теперь вы должны знать
- как записать число в регистр, в переменную
- как изменить бит в регистре
- как взять число из регистра
- как выполнить что-то в зависимости от значения бита в регистре или в переменной
Очень
доступно о Си рассказано здесь:
Андрей
Богатырев. Руководство полного идиота
по программированию на языке Си
обязательно используйте его при работе! и заглядывайте в него.
Статья "Си без Си" уважаемого и очень опытного микроконтроллерщика - ник: Bill http://www.caxapa.ru/story/bill_1.html
Очень
советую вот это:
Ю.Ю.Громов, С.И.Татаренко
В пособии приведено подробное описание наиболее распространенного языка программирования Си для персональных компьютеров, совместимых с IBM PC, и описано применение средств языка на примерах задач работы со списками.
Учебное
пособие предназначено для
студентов всех специальностей,
аспирантов и инженерно-технических
работников использующих вычислительную
технику.
Может быть использовано как справочное
пособие для широкого круга
программистов, как профессионалов,
имеющих большой опыт работы на Си, так и
начинающих программировать на Си.
1.1.
ЭЛЕМЕНТЫ ЯЗЫКА СИ
1.1.1.
Используемые символы
1.1.2.
Константы
1.1.3.
Идентификатор
1.1.4.
Ключевые слова
1.1.5.
Использование комментариев в тексте
программы
1.2.
ТИПЫ ДАННЫХ И ИХ ОБ ЯВЛЕНИЕ
1.2.1
Категории типов данных
1.2.2.
Целый тип данных
1.2.3.
Данные плавающего типа
1.2.4.
Указатели
1.2.5.
Переменные перечислимого типа
1.2.6.
Массивы
1.2.7.
Структуры
1.2.8.
Объединения (смеси)
1.2.9.
Поля битов
1.2.10.
Переменные с изменяемой структурой
1.2.11.
Определение объектов и типов
1.2.12.
Инициализация данных
1.3.
ВЫРАЖЕНИЯ И ПРИСВАИВАНИЯ
1.3.1.
Операнды и операции
1.3.2.
Преобразования при вычислении
выражений
1.3.3.
Операции отрицания и дополнения
1.3.4.
Операции разадресации и адреса
1.3.5.
Операция sizeof
1.3.6.
Мультипликативные операции
1.3.7.
Аддитивные операции
1.3.8.
Операции сдвига
1.3.9.
Поразрядные операции
|
Я обнаружил ошибку в разделе 1.3.10 правильно вот так: Операция логического И (&&) вырабатывает значение 1 если оба операнда имеют НЕнулевые значения. |
||
|
|
1.3.11.
Операция последовательного вычисления
1.3.12.
Условная операция
1.3.13.
Операции увеличения и уменьшения
1.3.14.
Простое присваивание
1.3.15.
Составное присваивание
1.3.16.
Приоритеты операций и порядок
вычислений
1.3.17.
Побочные эффекты
1.3.18.
Преобразование типов
1.4.
ОПЕРАТОРЫ
1.4.1.
Оператор выражение
1.4.2.
Пустой оператор
1.4.3.
Составной оператор
1.4.4.
Оператор if
1.4.5.
Оператор switch
1.4.6.
Оператор break
1.4.7.
Оператор for
1.4.8.
Оператор while
1.4.9.
Оператор do while
1.4.10.
Оператор continue
1.4.11.
Оператор return
1.4.12.
Оператор goto
1.5.
ФУНКЦИИ
1.5.1.
Определение и вызов функций
1.5.2.
Вызов функции с переменным числом
параметров
1.5.3.
Передача параметров функции main
1.6.
СТРУКТУРА ПРОГРАММЫ И КЛАССЫ ПАМЯТИ
1.6.1.
Исходные файлы и объявление переменных
1.6.2.
Объявления функций
1.6.3.
Время жизни и область видимости
программных объектов
1.6.4.
Инициализация глобальных и локальных
переменных
1.7.
УКАЗАТЕЛИ И АДРЕСНАЯ АРИФМЕТИКА
1.7.1.
Методы доступа к элементам массивов
1.7.2.
Указатели на многомерные массивы
1.7.3.
Операции с указателями
1.7.4.
Массивы указателей
1.7.5.
Динамическое размещение массивов
1.8.
ДИРЕКТИВЫ ПРЕПРОЦЕССОРА
1.8.1.
Директива #include
1.8.2.
Директива #define
1.8.3.
Директива #undef
2.
ОРГАНИЗАЦИЯ СПИСКОВ И ИХ ОБРАБОТКА
2.1.
ЛИНЕЙНЫЕ СПИСКИ
2.1.1.
Методы организации и хранения линейных
списков
2.1.2.
Операции со списками при
последовательном хранении
2.1.3.
Операции со списками при связном
хранении
2.1.4.
Организация двусвязных списков
2.1.5.
Стеки и очереди
2.1.6.
Сжатое и индексное хранение линейных
списков
2.2.
СОРТИРОВКА И СЛИЯНИЕ СПИСКОВ
2.2.1.
Пузырьковая сортировка
2.2.2.
Сортировка вставкой
2.2.3.
Сортировка посредством выбора
2.2.4.
Слияние списков
2.2.5.
Сортировка списков путем слияния
2.2.6.
Быстрая и распределяющая сортировки
2.3.
ПОИСК И ВЫБОР В ЛИНЕЙНЫХ СПИСКАХ
2.3.1.
Последовательный поиск
2.3.2.
Бинарный поиск
2.3.3. М-блочный
поиск
2.3.4.
Методы вычисления адреса
2.3.5.
Выбор в линейных списках
2.4.
РЕКУРСИЯ
Вообще сайт СитФорум
по программированию ПК рулит!
Повторю:
Отличное руководство по Си для AVR это HELP в компиляторе CodeVisionAVR
Читайте его и ищите в нем интересующее вас по ключевым словам.
Чтобы двигаться дальше вам нужны программы:
1) Компилятор CodeVisionAVR
2) Софт симулятор-эмулятор AVR VMLAB
3) Вы должны знать материал предыдущих страниц курса
Если это так: Приступайте к работе!
Задачи-упражнения
курса - это практические занятия, примеры по
написанию программ для AVR с
сопутствующим
кратким изложением необходимых теоретических сведений
сопровождаемым скриншотами программ. Поверьте
просто читать задачи - пользы МАЛО ! Как читать самоучитель игры на
пиано или гитаре не
тренируясь на
инструменте: сколько не читай - играть ни фига не научишься ...
Задачи нужно проделать читая, прочувствовать - только так!
Большинство задач могут быть выполнены виртуально, на ПК. Вам не нужно покупать МК и что-то паять, что либо сжигать и вдыхать пары флюса...
знакомство с компилятором Си CodeVisionAVR, схема, алгоритм, написание и компиляция первой рабочей программы.
Операции над отдельными
битами.
знакомство с эмулятором электронных устройств - VMLAB - симулятором МК AVR на примере файла-прошивки полученной в задаче 01.
Мигаем светодиодами, измеряем
длительность сигналов на экране
виртуального осциллографа (окно scope)
Закрепить навыки программирования и работы в компиляторе CodeVisionAVR
очень подробно и с картинками учимся моделировать работу электронного устройства в симуляторе VMLAB
Делаем универсальный таймер на микроконтроллере ATmega8, с дискретной установкой времени.
Адаптер для связи вашего МК устройства с COM-портом ПК по rs232.
Метод отладки вашего устройства - нахождение ошибок программы и "железа" с помощью вставки контрольных сообщений в текст программы.
Программы для ПК позволяющие вести, отслеживать и сохранять на жестком диске обмен по COM-портам.
Создаём программу для ATmega16 принимающую и передающую данные обмениваясь ими с ПК через COM-порт по интерфейсу rs232 с помощью USART встроенного в МК серии ATmega.
Углубляем навыки создания программы в CVAVR и продолжаем использовать Си для микроконтроллеров.
Подключаем и управляем символьным ЖКИ LCD 16x2 (2 строки по 16 символов)
Тщательное знакомство с компилятором ICC и подробный рассказ с картинками о применении его мастера начального кода.
Создаем программу 50 раз в секунду прерывающуюся по Таймеру_0 и посылающую данные на ПК.
Точная подгонка временных интервалов создаваемых с помощью таймеров. Различные режимы работы таймеров.
В симуляторе VMLAB проверяем правильность времени прерываний и сохраняем принятые от МК данные в файл.
Помнить все! добавляем 2 Мб памяти - быстрой и не забывающей информацию при отключении питания - стоит всего 5 баксов. Подключение AT45DB161 к МК AVR по SPI со схемой и программой на Си с подробными комментариями.
Что такое ШИМ (PWM) сигнал. Как аппаратно сделать ШИМ.
Как сделать ЦАП с помощью ШИМ и отфильтровать сигнал - т.е. получить аналоговый сигнал из цифрового.
Программа к задаче написана в компиляторе Си CodeVisionAVR, симуляция выполнена в VMLAB.
Электронный вольтметр - измеритель вибрации.
Цель задачи: разработать устройство и программу для МК ATmega16 для измерения напряжения и частоты сигнала от датчика вибрации и отображения результата на 2х разрядном 7-ми сегментном светодиодном индикаторе.
Задача знакомит с АЦП ATmega16 (такой же в ATmega32 ATmega64 ATmega128) используется компилятор CodeVisionAVR - дан пошаговый пример создания программы с нуля. Симуляция в VMLAB с комментарием.
Проектирование входной цепи для сигнала
- расчет уилителя-фильра сигнала перед подачей на АЦП
- применение ОУ (операционных усилителей) для изменения параметров входного сигнала
- защита устройства от внешних электрических воздействий !
Устройство изменяющее состояние нагрузки при громком звуке длительностью от 5 до 20 мС.
Цель задачи: разработать устройство и программу для МК ATmega16 которое будет анализировать длительность сигнала от микрофона и если она будет лежать в пределах 5-20 мС то будет менять состояние подключенной нагрузки: если была выключена - то включит и наоборот.
Задача повторяет-закрепляет навык генерации начального кода программы в компиляторе CodeVisionAVR для ATmega16.
Задача
11
АЦП - аналоговый сигнал
преобразуем в Цифровой код при помощи 10
битного АЦП встроенного (там целых 8
каналов!) в МК
AT90s8535.
Программу пишем на CodeVisionAVR, компилируем
и затем отладим в эмуляторе с
наблюдением движения программы по
тексту на Си.
Приступайте
к работе! Того что
есть вполне достаточно для уверенного
старта, остальное в
АпНоутах
и в
Интернете
навалом.
Вы не спец и надеюсь не собираетесь делать серийное устройство, соответственно вопросы конкурентной борьбы и цены МК в серии вас не сильно волнуют - вам похоже нужно комфортно, без изворотов и ухищрений, получить быстрый результат.
Я уже
давал совет на 1-й странице курса,
здесь дополню:
Комфортно
касательно МК
- это когда много памяти и ножек (выводов,
пинов) чтоб не сталкиваться с их не
хваткой.
Комфортно когда на одном МК
вы сможете
сделать и то что вам надо сейчас и надо
будет сделать потом и легко что-то добавить в работающую систему.
Советую вам выбрать универсальный МК - пусть он будет один у вас - зато вы сможете хорошо его узнать и не тратить время на изучение разных МК под каждый следующий проект.
Используйте ATmega16 (-32 -64 -128)
ATmega16
недорогой, выпускается в 40-ка выводном
удобном для самоделкиных корпусе DIP-40 с
шагом ножек 2.54 мм. длина МК - 53 мм ширина 17
мм.
|
|
- 16 Кб многократно программируемой памяти (Flash Program Memory) для вашей программы,
- 1 Кб оперативной памяти SRAM,
- 512 байт памяти EEPROM - сохраняющей информацию при отключении питания,
- 8-ми канальный 10 битный АЦП (АЦП 90s8535)
- USART позволит вам организовать скоростной двусторонний обмен по Rs232 с COM портом ПК, либо с другими устройствами,
- TWI интерфейс (это i2c но по ATMEL'овски)
- SPI интерфейс (пример
использования)
при напряжении питания от 4,5 до 5,5 вольт
может работать с тактовой частотой от 0
до 16 МГц - эта частота определяется
внешним кварцевым или керамическим
резонатором, либо другим внешним
источником тактирующего сигнала либо
простым RC генератором - встроенным или внешним.
этот
МК может работать без кварца так как
имеет встроенный RC генератор,
обеспечивающий частоту 1, 2, 4 или 8 МГц с
точностью +- 3%. Во многих устройствах
такая точность достаточна. Её
можно повысить калибровкой,
она описана в Апликухах (надеюсь вы уже
знаете что это такое!)
С
завода МК ATmega поставляются с включенным внутренним генератором на 1
МГц. Изменить это можно изменив программатором
установку Фьюзов МК.
Если вы
выбрали другой AVR - ни чего страшного,
так как это именно семейство МК, все они
имею одинаковый набор инструкций и
программы легко переносятся с одного на
другой с минимальной - однако
необходимой!
корректировкой.
После выбора МК Вам необходимо скачать
ДатаШит (ДШ) на него (DataSheet.pdf)
- это паспорт МК в нем есть "Errata" -
описание уже обнаруженных ошибок МК - про
него не забывайте!
Идеально распечатать и изучить весь ДШ -
но я понимаю, что сделать это не просто,
он ведь большой.
Поэтому настоятельно прошу вас
распечатать стр. 1-5 и раздел "Register Summary"
(примерно стр. 329-330) - это список регистров МК и
ссылки на номера страниц с их подробным
описанием.
Скачивайте свежий ДШ !
Обычно первый монтаж устройства выполняют на макетных платах (а в случае единичного устройства такой монтаж бывает и окончательным вариантом).
Здесь
посмотрите варианты простых макетных
плат от
OLIMEX
там же есть интересные проекты устройств на AVR!
Такие макетные платы
продаются в магазинах компонентов,
а
схемы свободно доступны на сайте.
Макетка - это обычная печатная плата содержащая
множество отверстий обычно с шагом 2.54 мм, с одной (реже с двух)
стороны вокруг отверстий есть луженые медные площадки.
Компоненты вставляют ножками в отверстия а с обратной стороны производят соединения гибким монтажным проводом. Вот пример монтажа устройства на макетной плате: (Это JDM-программатор для МК PIC и устройств с интерфейсом i2c )
|
|
На монтажной плате желательно размещать компоненты с одной стороны а все проводники с другой, получается очень аккуратный и качественный монтаж.
Если сторону проводников после тестирования,
промыть от флюса растворителем,
просушить и залить компаундом или лаком - то устройство наверняка
будет работать долго и надежно.
Чтоб не забыть запаять какой то проводник,
удобно зачеркивать карандашом на бумажном рисунке
схемы устройства каждое сделанное
соединение.
Очень удобно конденсаторы и резисторы брать чипы
размера
0805 и 0603 и паять прямо на ножки компонентов.
|
|
Немного о пайке:
Подробно: Припои флюсы способы пайки - статья в FAQ'е курса
|
|
Очень рекомендую прочитать! Руководство по правильной разводке печатных плат и проводов в устройстве Подробно разъяснено происхождение, излучение и влияние электромагнитных помех и методы их снижения для обеспечения EMC.
Внимание ! Удобно купить мощный многоногий МК уже припаянный на плату с некоторыми нужными дополнительными элементами. вот ATmega128 к примеру, на плате:
USB встроен и прочие приятности - документация тут.
в отверстия по краю платы впаяйте гребенки штырьков или гнезд и затем к ним подключайте без пайки разъемы с проводами, либо ставьте на ответные части разъема впаянные в плату основного устройства или на большую макетную плату.
Аналогичный модуль от Olimex
подешевле но и возможностей поменьше, зато контакты по краю платы уже запаяны.
А вот подороже но и по-навороченей: (Тестовая программа для платы ) :
Более качественный монтаж можно
выполнить изготовив специальную плату
для вашего устройства - обычно это
делают уже отладив устройство в
симуляторе и/или на макетной плате. Вот
примерный вид рисунка печатных
проводников для переноса на плату:
|
|
|
|
|
А вот тот же программатор JDM, но собранный на специальной печатной плате со сверлением: |
|
|
Для рисования схем и "разводки" (размещение
компонентов на плате и прокладка
соединяющих дорожек) печатной
платы устройства рекомендую
- мощная и очень
популярная
у электронщиков программа рисования схем и "разводки" (размещение
компонентов на плате и прокладка
соединяющих дорожек) печатной
платы устройства:
EAGLE (Она
бесплатна для плат достаточно большого
размера.)
Программа автоматически
размещает компоненты на
плате и может развести дорожки сама. Вам нужно
только нарисовать схему, выбрать
корпуса для всех компонентов и задать
размеры
платы.
На сайте вы
можете скачать дополнительные библиотеки
электронных компонентов и различные микроконтроллерные
проекты со схемами и печатными платами
выполненными в этой программе.
Очень
рекомендую!
( краткое руководство по
EAGLE накрапал на русском)
Еще :
DipTrace
-
очень приятная в работе программа! Чудесно
разводит платы
в автоматическом режиме.
1) Рисунок печатной платы ЗЕРКАЛЬНО печатаю на глянцевой стороне "Универсальной бумаги для струйной печати" LOMOND - глянцевая-матовая двухсторонняя 50 листов А4, вес 170 гр/м2 (на торце пачки и над штрих-кодом номер 0102009) с обычными настройками принтера HP LaserJet 6P. Можно использовать испорченные, неудачные фотографии.
К рисунку платы можно добавить изображение рамки большей чем контур заготовки платы примерно на 1 мм с каждой стороны - так будет легко правильно совместить рисунок и плату. Или сделать в плате 2 (или больше) отверстия диаметром 3-4 мм, измерить РЕАЛЬНОЕ расстояние между ними и нанести на рисунок платы соответствующие перекрестия-прицелы для точного визуального совмещения рисунка с платой. Это полезно при изготовлении двухсторонних плат.
2) Медь платы я шкурю шкуркой с зерном 300-500 в перекрестных направлениях, затем стираю пыль тампоном из бинта. Не касайтесь поверхности платы пальцами!
3) Положите на
ровную УСТОЙЧИВУЮ поверхность:
- упругий, ровный материал типа коврика
мыши или листовой жесткий упаковочный мелкопористый
поролон (я использовал 20 мм)
- 2 листа бумаги А4
- рисунок ЗЕРКАЛЬНЫЙ платы тонером вверх !!!
- плату положите на рисунок КОНЕЧНО медью к
тонеру, для центровки используйте
прозорливо напечатанные контуры или
отверстия в плате совмещаемые с перекрестиями на рисунке.
- если плата большая, то для более равномерного распределения нагрузки и
тепла положите сверху еще 2-4 заготовки для плат.
- лист бумаги А4 чтоб не коцать подошву утюга.
- утюг ХОЛОДНЫЙ !!!
- груз на утюг - я кладу 2 кГ сахара в мешках на плату 60х80.
Центр тяжести утюга с грузом должен быть
примерно по центру заготовки платы, чтоб
стоял устойчиво без перекоса - тогда рисунок будет равномерно прижат к меди.
4)
Моё ноу-хау
в этом методе, возможно
и позволяющее уверенно
получать дорожки 0.1 мм -
НЕ НАДО ТОРКАТЬ ГОРЯЧИЙ
УТЮГ ТУДА-СЮДА ! Вы просто
отходите в сторонку от этого "пирога"
и нежно включаете утюг в розетку. Он
нагревается и сам выключается-включается терморегулятором. Регулятор
утюга я ставлю на "3" - у моего утюга это 120-130 градусов всего.
(я использую принтер HP LJ 6P - его
тонеру этого достаточно). Не нужно
греть сильней
После первого автоматического отключения нагрева я жду 5 минут, выключаю утюг из розетки. Оставляю установку минут на 20-30, что бы "пирог" остыл ниже температуры плавления тонера. Теперь можно снять утюг.
5) Плату с фотобумагой положите в теплую воду. Примерно через 3-5 минут она намокнет и по краям отойдет от платы. Не спешите! Я оставляю на 30 минут "изделие". После этого бумага уже хорошо отделяется от фотослоя, который вживляется в поры тонера. Таким образом весть тонер покрыт фотослоем, его поры закрыты и при травлении дорожки получаются не изъеденными раствором.
К сожалению именно фотослой не дает делать зазоры менее 0.2 мм - он намертво заседает в маленьких зазорах и не желает от туда вымываться. Однако после высыхания фотослой легко вычищается из зазоров иголкой. Остатки бумаги и фотослоя скатываются пальцами в воде - но их бывает мало и лишь в нескольких местах.
6) После высыхания платы внимательно с линзой проверьте рисунок платы на наличие дефектов. Особенно фотослой в узких местах между тонером. Подретушируете при необходимости рисунок нитро-лаком (мебельный НЦ222, цапон, лак для ногтей) и кисточкой от лака для ногтей или зубочисткой.
7) Травлю, после высыхания ретуши, в хлорном железе в пластиковой емкости - свежий раствор работает быстрее, не грею.
удобно: Прикрепляю пенопласт к обратной стороне платы и плата плавает в хлорном железе травящейся стороной вниз - таким образом шлам от травления не оседает на плате а опускается на дно емкости и не препятствует травлению! Пенопласт является ручкой за которую его удобно вынимать для визуального контроля процесса травления.
Проверяйте процесс чаще ! Не передерживайте в растворе для уменьшения бокового подтрава узких дорожек!
8) Хорошо промойте плату проточной водой и смойте тонер растворителем, еще раз пошкурьте медь мелкой шкуркой, просушите плату.
Вот пример платы с дорожками 0.15 мм изготовленной по описанной технологии под программатор-отладчик для микроконтроллеров PIC ICD2

Линки на такие устройства на русском
языке
есть в низу заглавной страницы курса.
9) Я залуживаю всю медь платы паяльником с припоем предварительно смазав ватной палочкой медь активным флюсом. Плату держу сильно наклонно и веду жало паяльника всегда вниз от контактных площадок, чтоб на контактных площадках не скапливался припой!
Вот и все!
Напоминаю: Об основах и тонкостях электроники и схемотехники читайте в настольной книге электронщика: П.Хоровиц, У.Хилл. Искусство схемотехники на РУССКОМ языке.
Я советую прошивать микроконтроллер прямо из программатора встроенного в компилятор CodeVisionAVR через простейший адаптер - буквально "пять проводков" соединяющих принтерный порт ПК с прошиваемым микроконтроллером AVR.
ПОДРОБНО: Результат
написания и компиляции программы - файл-прошивку
с
расширением .hex (и возможно файл с содержимым для
EEPROM МК) нужно записать ("зашить") в МК .
МК AVR
многократно программируются прямо в устройстве в
котором будут работать -
такое программирование называют - "ин
систем программинн" или ISP.
Для этого установите на плате вашего
устройства
6 контактов, а лучше 6-ти
штырьковый разъем для ISP
|
вид
сверху платы на штырьки. |
Подробней по ISP разъемам посмотрите Апликейшн Ноут AVR910.
Вывод 2 нужно подключить к
+ питания МК
если вы собираетесь использовать
программатор
питающийся от вашего же
устройства - например фирменный ISP AVR.
Для "5 проводов" этот вывод
не подключается. Для программирования
достаточно 5 контактов. Соответственно
и разъем который вы будете использовать
может
быть любым удобным для размещения на плате и имеющий минимум 5
контактов. Все контакты
ISP разъема подсоединяются к ножкам
МК в соответствии с названиями.
|
ВНИМАНИЕ ! в ATmega64 и ATmega128 выводы MOSI и MISO не применяют для ISP Внимательно смотрите ДатаШит ! Например для ATmega128 сигналы MISO подключают к ножке PE1, MOSI подключают к ножке PE0 |
||
Я советую вам
пользоваться интерфейсом программирования встроенным в
компилятор CodeVisionAVR и конечно же в нем
разрабатывать программу для МК. Дело в том, что вам вряд ли удастся сразу
написать программу без ошибок, даже
после прогона в софт эмуляторе - симуляторе ваше
устройство может делать не то,
что вы от
него ожидаете - значит в программу нужно
будет вносить изменения и снова
зашивать в МК , и так раз 20 и более.
Вы
можете в компиляторе CodeVisionAVR открыть
меню "Проджект -> Конфига -> Афта
Мэйк" и отметить чек бокс "Program the
chip" затем ОК. Еще
нужно в меню "Сеттинс ->
Программер" выбрать ваш адаптер (подробней
ниже) для программирования. Теперь
после безошибочной компиляции
программы вам будет доступна кнопка "Program"
- нажмите на нее и произойдет
программирование МК - т.е. файл .hex будет
загружен в память программ МК. Затем МК будет "сброшен"
(на ножку RESET будет подан лог. 0 а затем опять
"1") и начнет выполнять только что прошитую (загруженную в него)
программу. Вам даже не нужно будет отсоединять
адаптер программирования от вашего устройства если вы не используете
в устройстве последовательный интерфейс SPI.
... и так
до окончательной отладки устройства.
|
В А Ж Н О ! В диалоге настройки программирования не трогайте галочки установки фьюзов МК если не разобрались четко что они делают! Иначе вы можете отключить режим ISP или внутренний RC-генератор и для следующего программирования вам понадобится ставить кварц с конденсаторами или даже искать Параллельный программатор для AVR. Но популярному ATtiny2313 даже параллельный программатор не поможет! |
||
в ATmegaXXX с завода включен внутренний RC генератор на частоте 1 МГц ( уточните это по ДШ и его возможные частоты ) Если вам нужна другая частота или нужно включить внешний кварцевый или керамический резонатор - вам нужно запрограммировать некоторые фьюзы по таблицам из ДШ или по таблице фьюзов на стр. 2
З а п о м н и т е :
НЕ запрограммированный фьюз 1
ЗАпрограммированный фьюз 0
Пример: Чтобы включить в ATmega16 внешний кварцевый резонатор с частотой от 3 до 8 МГц с конденсаторами (по схеме рис. 12 ДШ) найдите в ДШ раздел "System Clock".
В таблице 2 указаны комбинации фьюзов для разных источников тактового сигнала. Далее написано что с завода МК поставляется с такой комбинацией фьюзов
SKSEL 0001 SUT 10 CKOPT 1
По таблице 4
находим :
Для кварца с частотой от 3 до 8 МГц
нужны конденсаторы от
12 до 22 пФ
и вот такая комбинация фьюзов :
SKSEL 1111 SUT 10 CKOPT 1
Установка фьюзов в программаторе компилятора CVAVR

Для прошивания МК
нажмите кнопку "Program All"
Для использования ATmega16 (и других мег) с внешним кварцевым или керамическим резонатором на частотах выше 8 МГц вам нужно установить фьюзы как в примере выше но запрограммировать CKOPT - значит сделать его "0". Т.е. вам нужна такая комбинация:
SKSEL 1111 SUT 10 CKOPT 0
CKOPT 0 - нужен и тогда когда вы хотите подключить к XTAL2 другой микроконтроллер или тактируемый прибор.
Фьюзы SUT - определяют
запуск генератора тактового сигнала, в большинстве случаев их установку
можно оставить "как с завода" - SUT 10
- более детально это описано в даташите в таблицах до 12.
Для соединения компьютера с
ISP разъемом устройства на AVR
Советую сделать адаптер от STK200
- это "правильные 5 проводков" с микросхемой
буфером снижающим вероятность случайного повреждения порта ПК.
В
установках компилятора CodeVisionAVR интерфейс "5-проводков"
называется "Канда системз STK200+/300"
Программа узнаёт адаптер STK200 по перемычкам на
разъеме
параллельного порта к которому
он подключается - должны быть соединены
двумя перемычками пары выводы: 2 и 12, 3 и 11.
|
Внимание! Для программирования к МК должно быть подключено питание. Например +4...+5 вольт ко всем выводам МК в названии которых есть VCC и 0 вольт ко всем выводам GND (это "общий" провод). Пример тут |
||
Если в МК нет
внутреннего генератора
тактового сигнала (например старые
AVR серии AT90sXXXX или мега побывавшая в чьих
то шаловливых руках изменивших фьюзы до того как попасть к вам) то
нужно подключить кварц
на 1 - 8
МГц и два конденсатора от 15 до 33 пФ. Либо
подать тактовый сигнал 1-1.5 МГц от внешнего источника
-
например генератора на микросхеме 74hc14
или на таймере LM555.
Программатор
AVReAl
может программировать
МК
без
кварца и без конденсаторов.
Он
выводит тактовый сигнал на
выв. 5 LPT его нужно подать на ножку XTAL1 МК
и добавить в командной строке
AVReAL специальный ключ "-o0".
Программатор
AVReAl
позволяет назначать какие ножки LPT порта
использовать -
это будет полезно когда часть
ножек LPT вы уже спалите
:-)
(Тактовый сигнал генерирует и программатор на USB по ссылке внизу этой страницы.)
Еще очень советую поставить подтягивающий резистор 10 кОм от ножки Reset МК на питание VCC и конденсатор 0.01-0.33 мкФ (в апноутах AVR040 и AVR042 рекомендуют 0.01 мкФ) от Reset на GND - как в схеме к задаче 7 курса.
|
Я использую самый простой вариант адаптера STK200 - "для самых ленивых" - пять поводков соединяющих линии параллельного (LPT) порта ПК и AVR так же как на схеме STK200 выше, но без микросхемы буфера. Лучше все же токоограничительные резисторы от 150 до 270 ом впаять Проводки не более 15 см длиной ! |
||

Адаптер "5-проводков" прекрасно
работает
с
компилятором CodeVision
|
Советую для изготовления адаптера взять " принтерный" шнур - он длинный и экранированный, а не экранированные проводки не стоит делать более 10-15 см. |
||
Для питания устройства при
программировании и отладке можно
кроме
сетевого адаптера использовать:
- батарейку на 6 вольт с 2 диодами последовательно для понижения напряжения...
- можно три батарейки по 1,5 вольт последовательно соединить
...
а можно +5 вольт взять с вывода
1 гейм порта компьютера или осторожно из гнезда USB.
Желательно питать устройство от ПК! В этом случае "земля" вашего устройства будет соединена с корпусом ПК и можно будет безопасно подключать и отключать разъем программирующего адаптера.
|
ВНИМАНИЕ! Всегда старайтесь первыми соединить "земли" устройств, а затем питание и потом уже сигнальные линии. |
||
Не поленитесь: спаяйте
адаптер STK200
на микросхеме буфере по рисункам внизу страницы - так как LPT
порт компьютера более нежен чем COM -
соответственно его спалить проще...
|
Если вы хотите использовать ножки МК SCK, MOSI, MISO в вашем устройстве то подключайте другие компоненты к ним через резисторы 4.7 КОм - чтобы не мешать программированию. Так рекомендовано в апноуте AVR042 Для Мега64, -128, -256 вместо MOSI и MISO используются другие ножки для ISP программирования ! |
||
Если у вас нет LPT порта сделайте Аналог "5 проводков" для COM-порта
Или соберите простой, дешевый USB программатор для AVR
Или соберите похожий программатор USB программатор AVR и AT89s
Вот топик об успешной сборке этого интерфейса для программирования на ATmega8. Это новый вариант платы для него. Архив с разводкой платы Внимание ! Этот программатор выдает тактовый сигнал 1 МГц и меньше для прошивки МК без кварца и с выключенным внутренним генератором. тактовый сигнал выводится на контакт "LED". Его нужно подвести к ножке XTAL1.
|
Существуют специальные программы "бутлодеры" которые записываются в микроконтроллер способами перечисленными выше и после этого микроконтроллер может сам, при включении, закачивать в себя программу (например из ПК через адаптер UART rs232 COM port - схема в задаче 4 курса) и запускать ее выполнение. Есть много бесплатных загрузчиков
|
||
Программатор AVR микроконтроллеров. LPT программатор.
Светодиод VD1 индицирует режим записи микроконтроллера,
светодиод VD2 - чтения,
светодиод VD3 - наличие питания схемы.
Напряжение, необходимое для питания схема берёт с разъёма ISP, т.е. от программируемого устройства. Эта схема является переработанной схемой программатора STK200/300 (добавлены светодиоды для удобства работы), поэтому она совместима со всеми программами программаторов на PC, работающих со схемой STK200/300. Для работы с этим программатором используйте программу CVAVR
Программатор можно выполнить на печатной плате и поместить её в
корпус разъёма LPT, как показано на рисунках:
|
|
|
|
|
|
Это профессиональное средство для программирования и отладки программы МК ATmega фирмы Atmel в реальном устройстве. Он полностью совместимый с оригинальным AVR JTAG ICE.
Автор данного устройства Milan Kostomlatsky kosta@mcu.cz Оригинальное описание находится здесьПример реализации: на макетке
Platan.ru
Рускоязычный
сайт с морем информации по любым
электронным компонентам там же: цены, DataSheet'ы и заказы р-деталей
почтой по России. Можете бесплатно заказать CD-ROM'ы с
документацией ведущих производителей
компонентов.
Интересный
AVR сайт: Sin-bad.narod.ru
с информацией по AVR для начинающих и русским
описанием архитектуры этих МК, приемы
программирования, документация.
В разделе "AVR документация"
рекомендую пункты 5,6,9,10,13 - это
переводы фирменых атмеловских Application
Notes ссылка на оригинал которых
находится ниже по тексту.
Советую скачать и прочитать внимательно: "серия из 11 статей по МК опубликованых в журнале "СхемоТехника" под общем названием: Микроконтроллеры? Это же просто! - подробно рассказывается о том что же такое микроконтроллер и как с ним работать" автор А. Фрунзе - много пишет для начинающих в различных журналах - в низу страницы.
СОВЕТУЮ: будет время - скачайте и
прочитайте 4 статьи из журнла Circuit
Cellar (очень ценный
журнал по электронным самоделкам на
профессиональном уровне) о применении в
достаточно серьезных проектах
компилятора Си ICC AVR:
Цитата:
Circuit Cellar magazine publishes many articles that use the ImageCraft compilers. Here are some that are using especially helpful for ICCAVR users, from beginners to advanced users:
1. Taking a Swim with Atmel's STK500
2. Still Swimming With the STK500, Onto the JTAG ICE
3. Design with STKxxx, Build an Ethernet Controller
4. Construct an ATA Hard Drive Controller
По ссылкам
ищите "Соусыз и пдф" и скачивайте .pdf
файлы статей, там же есть ссылки на
прилагаемые "исходники" к статьям.
Здесь
все публикации журнала с 1988 года -
некоторые в свободном доступе.
Базовые знания по Электронике можно получить здесь:
2) Analog Dialogue - Крупнейший производитель компонентов публикует теоретические сведения для электронщиков - все прекрасно рассказано, с картинками и бесплатно!
Профессиональные
разработчики обычно используют для
отладки устройство: AVR JTAG ICE. подробную информацию и документацию
смотрите на сайте
производителя. стоит
устройство под сотню баксов и позволяет
отлаживать программу прямо в реально
изготовленном, работающем устройстве. Вы можете за
меньшие деньги сделать
AVR JTAG ICE самостоятельно
Я тоже обычно
отлаживаю программу прямо в реально
изготовленном, работающем устройстве. при
помощи адаптера и способа описанных в задаче
4 курса.
Полезные ссылки и нформация ниже
|
Название |
Авторы |
Источник |
Скачать |
|
Исходник для работы с DS190A (ключ-микросхема индентификации от DALLAS) |
Конышев Ю.А. |
||
|
Исходник для работы с LCD (1 строка на 16 символов) с подключением по 8-х битному интерфейсу |
Конышев Ю.А. |
||
|
Исходник для работы с LCD (1 строка на 16 символов) с подключением по 4-х битному интерфейсу |
Конышев Ю.А. |
||
|
Пример (в Excel) расчета значения регистров перезагрузки таймеров/счетчиков для определения скорости UART1 в C8051F120 |
Конышев Ю.А. |
||
|
Пример (в Excel) расчета значения регистров перезагрузки таймеров/счетчиков для определения скорости UART0 в C8051F120 |
Конышев Ю.А. |
||
|
Пример (в Excel) расчета значения регистра SPI0CKR для определения скорости интерфейса SPI0 в C8051F120 |
Конышев Ю.А. |
||
|
Пример (в Excel) расчета значения регистра SMB0CR для определения скорости интерфейса SMBus в C8051F120 |
Конышев Ю.А. |
||
|
Пример - считывание 26-ти и 34-х битных кодов карт посредством 4-х Proximity считывателей (HID, PW, EM-Marin и др.) и управление исполнительными устройствами. Используется C8051F226 с вводом/выводом д |
Конышев Ю.А. |
||
|
Библиотека временных задержек для микроконтроллеров Silabs рассчитанных для тактовой частоты равной 24мГц |
Конышев Ю.А. |
||
|
Библиотека временных задержек для микроконтроллеров Silabs рассчитанных для тактовой частоты равной 11,059мГц |
Конышев Ю.А. |
||
|
Пример работы c датчиком температуры DS18B20 с выводом результата на LCD (измерение температуры, эксперементы с интерфейсом 1-Wire) |
Конышев Ю.А. |
||
|
Пример работы c АЦП (ADC0) в C8051F330 с выводом результата на LCD (измерение напряжения на входе АЦП и температуры кристала микроконтроллера со встроенного датчика TempSensor) |
Конышев Ю.А. |
||
|
Пример работы c АЦП (ADC0) в C8051F330 с выводом результата на LCD (измерение напряжения на входе АЦП) |
Конышев Ю.А. |
||
|
Руководство программиста по созданию USB Mass Storage приборов ("AN282SW.ZIP") |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство программиста по созданию USB Mass Storage приборов ("AN282: USB Mass Storage Device Reference Design Programmer's Guide") |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры реализации голосового рекодера на микроконтроллере C8051F41x (Voice_Recorder) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры реализации голосового рекодера на микроконтроллере C8051F41x (Voice_Recorder) |
Silicon Laboratories |
www.silabs.com |
|
|
Оптимизация и расчет энергопотребления в малогабаритных микроконтроллерах серий С8051F30x и С8051F31x (Power Management Techniques for the 'F30x and 'F31x) |
Silicon Laboratories |
www.silabs.com |
|
|
Оптимизация и расчет энергопотребления в малогабаритных микроконтроллерах серий С8051F30x и С8051F31x (Power Management Techniques for the 'F30x and 'F31x) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по переходу с С8051F02x на С8051F12x (Porting Considerations from F02x to 'F12x) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по переходу с С8051F02x на С8051F12x (Porting Considerations from F02x to 'F12x) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование банков памяти программ для расширения адресного пространства в компиляторе Keil 8051 (Code Banking Using the Keil 8051 Tools) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование банков памяти программ для расширения адресного пространства в компиляторе Keil 8051 (Code Banking Using the Keil 8051 Tools) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство пользователя по эволюционному комплекту DTMF-RD (DTMF-RD User's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация DTMF декодера на базе микроконтроллера C8051F300 (DTMF Decoder Reference Design) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация функций самопрограммирования и внутрисхемного программирования flash-памяти в микроконтроллерах C8051Fxxx (Production Programming Options for Silicon Labs Devices) |
Silicon Laboratories |
www.silabs.com |
|
|
Функции быстрого преобразование Фурье для семейства быстродействующих микроконтроллеров C8051F12x (FFT Routines for the C8051F12x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Функции быстрого преобразование Фурье для семейства быстродействующих микроконтроллеров C8051F12x (FFT Routines for the C8051F12x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Программная реализация SPI-интерфейса в микроконтроллерах C8051F30x (Software SPI Examples for the C8051F30x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Программная реализация SPI-интерфейса в микроконтроллерах C8051F30x (Software SPI Examples for the C8051F30x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство разработчика приложений с TCP/IP с использованием библиотеки TCP/IP Library (TCP/IP Library Programmer's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство разработчика приложений с TCP/IP с использованием библиотеки TCP/IP Library (TCP/IP Library Programmer's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по реализации ZigBee интерфейса на базе микроконтроллера C8051F121 (2.4 GHZ ZIGBEE™ DEMONSTRATION USER’S GUIDE) |
Silicon Laboratories |
www.silabs.com |
|
|
Конфигурирование и использование выводов GPIO.x в качестве линий ввода/вывода специального назначения (Port Configuration and GPIO for CP210x) |
Silicon Laboratories |
www.silabs.com |
|
|
Конфигурирование и использование выводов GPIO.x в качестве линий ввода/вывода специального назначения (Port Configuration and GPIO for CP210x) |
Silicon Laboratories |
www.silabs.com |
|
|
Установка параметров и работа с преобразователями интерфейсов CP210x в среде Visual Studio 6.0. (CP210x Device Customization Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по написанию программного обеспечения для передачи данных с использованием преобразователей интерфейсов CP210x в среде WinAPI (Serial Communications Guide for CP210x) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по написанию программного обеспечения для передачи данных с использованием преобразователей интерфейсов CP210x в среде WinAPI (Serial Communications Guide for CP210x) |
Silicon Laboratories |
www.silabs.com |
|
|
Создание драйверов для микроконтроллеров C8051F32x и преобразователей интерфейсов CP210x в среде Windows c использованием USB Express (C8051F32x and CP210x USB Driver Customization) |
Silicon Laboratories |
www.silabs.com |
|
|
Создание драйверов для микроконтроллеров C8051F32x и преобразователей интерфейсов CP210x в среде Windows c использованием USB Express (C8051F32x and CP210x USB Driver Customization) |
Silicon Laboratories |
www.silabs.com |
|
|
Описание и работа сигма-дельта АЦП в микроконтроллерах семейства C8051F35x (C8051F35x Delta-Sigma ADC User's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Программирование flash-памяти по 2-проводному интерфейсу С2 (FLASH Programming via the C2 Interface) |
Silicon Laboratories |
www.silabs.com |
|
|
Программирование flash-памяти по 2-проводному интерфейсу С2 (FLASH Programming via the C2 Interface) |
Silicon Laboratories |
www.silabs.com |
|
|
Особенности организации внутрисхемного программирования по интерфейсу C2 на целевой плате (Pin Sharing Techniques for the C2 Interface) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по работе с библиотекой USBXpress в WinAPI для микроконтроллеров C8051F32x и CP210x (USBXpress Development Kit User's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство по работе с библиотекой USBXpress в WinAPI для микроконтроллеров C8051F32x и CP210x (USBXpress Development Kit User's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
Оптимизация работы с памятью программ в микроконтроллерах серии C8051F12x для достижения производительности до 100 MIPS (Cache Optimizations for C8051F12x) Silicon Laboratories www.silabs.com |
Silicon Laboratories |
www.silabs.com |
|
|
Оптимизация работы с памятью программ в микроконтроллерах серии C8051F12x для достижения производительности до 100 MIPS (Cache Optimizations for C8051F12x) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация функций самопрограммирования flash-памяти микроконтроллера (Writing to FLASH from Application Code) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация функций самопрограммирования flash-памяти микроконтроллера (Writing to FLASH from Application Code) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование ЦАП в качестве генератора сигналов сложной формы (Using the DAC as a Function Generator) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование ЦАП в качестве генератора сигналов сложной формы (Using the DAC as a Function Generator) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры простых программ на языке Си для микроконтроллеров C8051F02x (Annotated 'C' examples for the 'F02x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры простых программ на языке Си для микроконтроллеров C8051F02x (Annotated 'C' examples for the 'F02x Family) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование Interface Utilities DLL в среде WinAPI для работы с интерфейсом отладки (Using C8051Fxxx On-Chip Interface Utilities DLL) |
Silicon Laboratories |
www.silabs.com |
|
|
О защите данных в flash-памяти от случайного и преднамеренного изменения/считывания (Flash Securities User's Guide) |
Silicon Laboratories |
www.silabs.com |
|
|
О необходимой минимальной задержке с момента переключения каналов АЦП до начала преобразования (Calculating Settling Time For Switched Capacitor ADC's) |
Silicon Laboratories |
www.silabs.com |
|
|
Методика увеличения разрешающей способности АЦП путем передискретизации и усреднения (Improving ADC Resolution by Oversampling and Averaging) |
Silicon Laboratories |
www.silabs.com |
|
|
Методика увеличения разрешающей способности АЦП путем передискретизации и усреднения (Improving ADC Resolution by Oversampling and Averaging) |
Silicon Laboratories |
www.silabs.com |
|
|
Руководство пользователя для эволюционной платы USB FM Radio |
Silicon Laboratories |
www.silabs.com |
|
|
Исходные коды для эволюционной платы USB FM Radio |
Silicon Laboratories |
www.silabs.com |
|
|
Техническое описание эволюционной платы USB FM Radio |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры для UART (Software UART Examples) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры для UART (Software UART Examples) |
Silicon Laboratories |
www.silabs.com |
|
|
Передача данных по последовательному интерфейсу SMBus/I2C в микроконтроллерах C8051F0xx (Serial Communication with the SMBus) |
Silicon Laboratories |
www.silabs.com |
|
|
Передача данных по последовательному интерфейсу SMBus/I2C в микроконтроллерах C8051F0xx (Serial Communication with the SMBus) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация функций самопрограммирования flash-памяти с загрузкой кода по интерфейсу UART для микроконтроллеров С8051F02x и С8051F30x (UART In-Application Code Loading Examples) |
Silicon Laboratories |
www.silabs.com |
|
|
Реализация функций самопрограммирования flash-памяти с загрузкой кода по интерфейсу UART для микроконтроллеров С8051F02x и С8051F30x (UART In-Application Code Loading Examples) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование таймеров в режиме ШИМ (16-Bit PWM Using an On-Chip Timer) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование таймеров в режиме ШИМ (16-Bit PWM Using an On-Chip Timer) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование таймера T2 для реализации часов реального времени (RTC) (Implementing a Real-Time Clock) |
Silicon Laboratories |
www.silabs.com |
|
|
Использование таймера T2 для реализации часов реального времени (RTC) (Implementing a Real-Time Clock) |
Silicon Laboratories |
www.silabs.com |
|
|
Программные методы расширения разрешающей способности ШИМ с использованием программируемого массива счетчиков (PCA) в качестве генератора сигналов ШИМ. (Implementing 16-Bit PWM Using the PCA) |
Silicon Laboratories |
www.silabs.com |
|
|
Программные методы расширения разрешающей способности ШИМ с использованием программируемого массива счетчиков (PCA) в качестве генератора сигналов ШИМ. (Implementing 16-Bit PWM Using the PCA) |
Silicon Laboratories |
www.silabs.com |
|
|
Подключение внешней статической памяти (Interfacing an External SRAM to the C8051Fxxx) |
Silicon Laboratories |
www.silabs.com |
|
|
Подключение внешней статической памяти (Interfacing an External SRAM to the C8051Fxxx) |
Silicon Laboratories |
www.silabs.com |
|
|
О программировании Flash-памяти микроконтроллеров по интерфейсу JTAG (Programming FLASH through the JTAG Interface) |
Silicon Laboratories |
www.silabs.com |
|
|
О программировании Flash-памяти микроконтроллеров по интерфейсу JTAG (Programming FLASH through the JTAG Interface) |
Silicon Laboratories |
www.silabs.com |
|
|
О встраивании компилятора Keil C в интегрированную среду разработки SiLabs IDE (Integrating Keil 8051 Tools into the Silicon Labs IDE) |
Silicon Laboratories |
www.silabs.com |
|
|
Об использовании встроенного температурного датчика (Using the On-Chip Temperature Sensor) |
Silicon Laboratories |
www.silabs.com |
|
|
Об использовании встроенного температурного датчика (Using the On-Chip Temperature Sensor) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры настройки параметров внутреннего и внешнего тактовых генераторов (Configuring the Internal and External Oscillators) |
Silicon Laboratories |
www.silabs.com |
|
|
Примеры настройки параметров внутреннего и внешнего тактовых генераторов (Configuring the Internal and External Oscillators) |
Silicon Laboratories |
www.silabs.com |
|
|
Пример конфигурации портов ввода-вывода с использованием Crossbar (Configuring the Port I/O Crossbar Decoder) |
Silicon Laboratories |
www.silabs.com |
|
|
Пример конфигурации портов ввода-вывода с использованием Crossbar (Configuring the Port I/O Crossbar Decoder) |
Silicon Laboratories |
www.silabs.com |
|
|
Исходный файл для работы с символьными LCD |
О.Николайчук |
|
|
|
Осваиваем (pdf, 1,631 Mb) |
Современные счетчики электроэнергии (djvu, 12.99 Мб ) |
Современные цифровые мультиметры (djvu, 19,507 Mb) |
|
|
|
|
|
Программный
ремонт (djvu, 13,6 Mb) |
Патрик Гёлль
(djvu, 5,4 Mb) |
Адаменко
М. В. (djvu, 8,8 Mb) |
|
Силовая электроника, 2006 |
Журналы: РадиоХобби 2006 № 1, 2, 3, Радио, Схемотехника, Радиоаматор, Ремонт электронной техники и др. доступны в файловом архиве |
Турута Е.Ф. "Активные SMD комоненты" 33000 кодов, 2006г. |
|
В.В. Красник |
Вольфганг Трамперт |